[FFmpeg-devel] [PATCH v2] avformat/matroskaenc: Avoid allocations for seekheads
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Wed Nov 27 07:44:22 EET 2019
Up until e7ddafd5, the Matroska muxer wrote two seekheads: One at the
beginning referencing the main level 1 elements (i.e. not the clusters)
and one at the end, referencing the clusters. This second seekhead was
useless and has therefore been removed. Yet the seekhead-related
functions and structures are still geared towards this usecase: They
are built around an allocated array of variable size that gets
reallocated every time an element is added to it although the maximum
number of seekheads is a small compile-time constant, so that one should
rather include the array in the seekhead structure itself; and said
structure should be contained in the MatroskaMuxContext instead of being
allocated separately.
The earlier code reserved space for a SeekHead with 10 entries, although
we currently write at most 6. Reducing said number implied that every
Matroska/Webm file will be 84 bytes smaller and required to adapt
several FATE tests.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
Resending because of updated FATE-tests.
libavformat/matroskaenc.c | 113 ++++++++-------------------
tests/fate/matroska.mak | 2 +-
tests/fate/wavpack.mak | 4 +-
tests/ref/fate/aac-autobsf-adtstoasc | 4 +-
tests/ref/fate/binsub-mksenc | 2 +-
tests/ref/fate/rgb24-mkv | 4 +-
tests/ref/lavf/mka | 4 +-
tests/ref/lavf/mkv | 4 +-
tests/ref/lavf/mkv_attachment | 4 +-
tests/ref/seek/lavf-mkv | 44 +++++------
10 files changed, 67 insertions(+), 118 deletions(-)
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 31ea1800b3..b60908a587 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -56,6 +56,10 @@
#include "libavcodec/mpeg4audio.h"
#include "libavcodec/internal.h"
+/* Level 1 elements we create a SeekHead entry for:
+ * Info, Tracks, Chapters, Attachments, Tags and Cues */
+#define MAX_SEEKHEAD_ENTRIES 6
+
typedef struct ebml_master {
int64_t pos; ///< absolute offset in the containing AVIOContext where the master's elements start
int sizebytes; ///< how many bytes were reserved for the size
@@ -68,11 +72,9 @@ typedef struct mkv_seekhead_entry {
typedef struct mkv_seekhead {
int64_t filepos;
- int64_t segment_offset; ///< the file offset to the beginning of the segment
- int reserved_size; ///< -1 if appending to file
- int max_entries;
- mkv_seekhead_entry *entries;
+ mkv_seekhead_entry entries[MAX_SEEKHEAD_ENTRIES];
int num_entries;
+ int reserved_size;
} mkv_seekhead;
typedef struct mkv_cuepoint {
@@ -126,7 +128,7 @@ typedef struct MatroskaMuxContext {
int64_t cluster_pts;
int64_t duration_offset;
int64_t duration;
- mkv_seekhead *seekhead;
+ mkv_seekhead seekhead;
mkv_cues *cues;
mkv_track *tracks;
@@ -398,10 +400,6 @@ static void mkv_deinit(AVFormatContext *s)
ffio_free_dyn_buf(&mkv->tracks_bc);
ffio_free_dyn_buf(&mkv->tags_bc);
- if (mkv->seekhead) {
- av_freep(&mkv->seekhead->entries);
- av_freep(&mkv->seekhead);
- }
if (mkv->cues) {
av_freep(&mkv->cues->entries);
av_freep(&mkv->cues);
@@ -410,61 +408,32 @@ static void mkv_deinit(AVFormatContext *s)
}
/**
- * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
- * elements. If a maximum number of elements is specified, enough space
- * will be reserved at the current file location to write a seek head of
- * that size.
- *
- * @param segment_offset The absolute offset to the position in the file
- * where the segment begins.
- * @param numelements The maximum number of elements that will be indexed
- * by this seek head, 0 if unlimited.
+ * Initialize the seekhead element to be ready to index level 1 Matroska
+ * elements. Enough space to write MAX_SEEKHEAD_ENTRIES seekhead entries
+ * will be reserved at the current file location.
*/
-static mkv_seekhead *mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset,
- int numelements)
+static void mkv_start_seekhead(MatroskaMuxContext *mkv, AVIOContext *pb)
{
- mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
- if (!new_seekhead)
- return NULL;
-
- new_seekhead->segment_offset = segment_offset;
-
- if (numelements > 0) {
- new_seekhead->filepos = avio_tell(pb);
+ mkv->seekhead.filepos = avio_tell(pb);
// 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
// and size, 6 bytes for a CRC32 element, and 3 bytes to guarantee
// that an EBML void element will fit afterwards
- new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 19;
- new_seekhead->max_entries = numelements;
- put_ebml_void(pb, new_seekhead->reserved_size);
- }
- return new_seekhead;
+ mkv->seekhead.reserved_size = MAX_SEEKHEAD_ENTRIES * MAX_SEEKENTRY_SIZE + 19;
+ put_ebml_void(pb, mkv->seekhead.reserved_size);
}
-static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, uint32_t elementid, uint64_t filepos)
+static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, uint64_t filepos)
{
- mkv_seekhead_entry *entries = seekhead->entries;
+ mkv_seekhead *seekhead = &mkv->seekhead;
- // don't store more elements than we reserved space for
- if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
- return -1;
-
- entries = av_realloc_array(entries, seekhead->num_entries + 1, sizeof(mkv_seekhead_entry));
- if (!entries)
- return AVERROR(ENOMEM);
- seekhead->entries = entries;
+ av_assert1(seekhead->num_entries < MAX_SEEKHEAD_ENTRIES);
seekhead->entries[seekhead->num_entries].elementid = elementid;
- seekhead->entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
-
- return 0;
+ seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset;
}
/**
- * Write the seek head to the file and free it. If a maximum number of
- * elements was specified to mkv_start_seekhead(), the seek head will
- * be written at the location reserved for it. Otherwise, it is written
- * at the current location in the file.
+ * Write the seek head to the file at the location reserved for it.
*
* @return The file offset where the seekhead was written,
* -1 if an error occurred.
@@ -472,19 +441,17 @@ static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, uint32_t elementid, ui
static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv)
{
AVIOContext *dyn_cp;
- mkv_seekhead *seekhead = mkv->seekhead;
+ mkv_seekhead *seekhead = &mkv->seekhead;
ebml_master seekentry;
- int64_t currentpos;
+ int64_t currentpos, remaining;
int i;
currentpos = avio_tell(pb);
- if (seekhead->reserved_size > 0) {
if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) {
currentpos = -1;
goto fail;
}
- }
if (start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD) < 0) {
currentpos = -1;
@@ -505,17 +472,13 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv)
}
end_ebml_master_crc32(pb, &dyn_cp, mkv);
- if (seekhead->reserved_size > 0) {
- uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
+ remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
put_ebml_void(pb, remaining);
avio_seek(pb, currentpos, SEEK_SET);
currentpos = seekhead->filepos;
- }
-fail:
- av_freep(&mkv->seekhead->entries);
- av_freep(&mkv->seekhead);
+fail:
return currentpos;
}
@@ -1434,9 +1397,7 @@ static int mkv_write_tracks(AVFormatContext *s)
AVIOContext *pb = s->pb;
int i, ret, default_stream_exists = 0;
- ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
- if (ret < 0)
- return ret;
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb));
ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS);
if (ret < 0)
@@ -1471,8 +1432,7 @@ static int mkv_write_chapters(AVFormatContext *s)
if (!s->nb_chapters || mkv->wrote_chapters)
return 0;
- ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
- if (ret < 0) return ret;
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb));
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS);
if (ret < 0) return ret;
@@ -1562,8 +1522,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid,
int ret;
if (!mkv->tags_bc) {
- ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
- if (ret < 0) return ret;
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_TAGS, avio_tell(s->pb));
ret = start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS);
if (ret < 0)
@@ -1732,8 +1691,7 @@ static int mkv_write_attachments(AVFormatContext *s)
if (!mkv->have_attachments)
return 0;
- ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
- if (ret < 0) return ret;
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS);
if (ret < 0) return ret;
@@ -1853,16 +1811,10 @@ static int mkv_write_header(AVFormatContext *s)
mkv->segment_offset = avio_tell(pb);
// we write a seek head at the beginning to point to all other level
- // one elements, which aren't more than 10 elements as we write only one
- // of every other currently defined level 1 element
- mkv->seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10);
- if (!mkv->seekhead) {
- return AVERROR(ENOMEM);
- }
+ // one elements (except clusters).
+ mkv_start_seekhead(mkv, pb);
- ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_INFO, avio_tell(pb));
- if (ret < 0)
- return ret;
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_INFO, avio_tell(pb));
ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO);
if (ret < 0)
@@ -2544,10 +2496,7 @@ static int mkv_write_trailer(AVFormatContext *s)
cuespos = mkv_write_cues(s, mkv->cues, mkv->tracks, s->nb_streams);
}
- ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_CUES,
- cuespos);
- if (ret < 0)
- return ret;
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos);
}
mkv_write_seekhead(pb, mkv);
diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak
index 7c48de1a61..ee5878aace 100644
--- a/tests/fate/matroska.mak
+++ b/tests/fate/matroska.mak
@@ -4,7 +4,7 @@
FATE_MATROSKA-$(call DEMMUX, MATROSKA, MATROSKA) += fate-matroska-remux
fate-matroska-remux: CMD = md5pipe -i $(TARGET_SAMPLES)/vp9-test-vectors/vp90-2-2pass-akiyo.webm -color_trc 4 -c:v copy -fflags +bitexact -strict -2 -f matroska
fate-matroska-remux: CMP = oneline
-fate-matroska-remux: REF = 5ae8144848acd392eaca8d43ff4aa5e6
+fate-matroska-remux: REF = 14319f0bd1989b98945337246c8eb9b4
FATE_MATROSKA_FFPROBE-$(call ALLYES, MATROSKA_DEMUXER) += fate-matroska-spherical-mono
fate-matroska-spherical-mono: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream_side_data_list -select_streams v -v 0 $(TARGET_SAMPLES)/mkv/spherical.mkv
diff --git a/tests/fate/wavpack.mak b/tests/fate/wavpack.mak
index b7bb563802..9beaec188d 100644
--- a/tests/fate/wavpack.mak
+++ b/tests/fate/wavpack.mak
@@ -91,12 +91,12 @@ fate-wavpack-matroskamode: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/special/matros
FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono
fate-wavpack-matroska_mux-mono: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska
fate-wavpack-matroska_mux-mono: CMP = oneline
-fate-wavpack-matroska_mux-mono: REF = ed8bf42aad172ec8e0ecc906e2fa27e6
+fate-wavpack-matroska_mux-mono: REF = 9108dd5afb464a190e9a8a651f2c837d
FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61
fate-wavpack-matroska_mux-61: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska
fate-wavpack-matroska_mux-61: CMP = oneline
-fate-wavpack-matroska_mux-61: REF = 425d2f82a22b86e4a8a71c2319284780
+fate-wavpack-matroska_mux-61: REF = 7de5d61441b6e69f88cde309052c674a
FATE_SAMPLES_AVCONV += $(FATE_WAVPACK-yes)
fate-wavpack: $(FATE_WAVPACK-yes)
diff --git a/tests/ref/fate/aac-autobsf-adtstoasc b/tests/ref/fate/aac-autobsf-adtstoasc
index edae3e6423..311af5d5fa 100644
--- a/tests/ref/fate/aac-autobsf-adtstoasc
+++ b/tests/ref/fate/aac-autobsf-adtstoasc
@@ -1,5 +1,5 @@
-ad50ade359efa0321c9111a08edada28 *tests/data/fate/aac-autobsf-adtstoasc.matroska
-6709 tests/data/fate/aac-autobsf-adtstoasc.matroska
+64fef0158181534b35c716e89663df3a *tests/data/fate/aac-autobsf-adtstoasc.matroska
+6625 tests/data/fate/aac-autobsf-adtstoasc.matroska
#extradata 0: 2, 0x0030001c
#tb 0: 1/1000
#media_type 0: audio
diff --git a/tests/ref/fate/binsub-mksenc b/tests/ref/fate/binsub-mksenc
index 9c2c3ea9bc..5eea19552e 100644
--- a/tests/ref/fate/binsub-mksenc
+++ b/tests/ref/fate/binsub-mksenc
@@ -1 +1 @@
-0248927de98ee861f626bd26ed61f9a0
+10f6efe9c120c9d2edb565fe13037488
diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv
index 57e812e48b..7ce09a967e 100644
--- a/tests/ref/fate/rgb24-mkv
+++ b/tests/ref/fate/rgb24-mkv
@@ -1,5 +1,5 @@
-00bd029ef542bf0eae4bd7c3480bff2a *tests/data/fate/rgb24-mkv.matroska
-58326 tests/data/fate/rgb24-mkv.matroska
+5ad0f72ea98538a361ee22be58e36694 *tests/data/fate/rgb24-mkv.matroska
+58242 tests/data/fate/rgb24-mkv.matroska
#tb 0: 1/10
#media_type 0: video
#codec_id 0: rawvideo
diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka
index f5f8db1598..39b5cb691e 100644
--- a/tests/ref/lavf/mka
+++ b/tests/ref/lavf/mka
@@ -1,3 +1,3 @@
-4184b7103e80e40e477b9c04b7360fc8 *tests/data/lavf/lavf.mka
-43673 tests/data/lavf/lavf.mka
+60eab6452def8ae6357fcc93f9e1c34b *tests/data/lavf/lavf.mka
+43589 tests/data/lavf/lavf.mka
tests/data/lavf/lavf.mka CRC=0x3a1da17e
diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv
index d9bdf98176..d93659ea83 100644
--- a/tests/ref/lavf/mkv
+++ b/tests/ref/lavf/mkv
@@ -1,3 +1,3 @@
-03d729410856242aaedcbd8c6f71d97e *tests/data/lavf/lavf.mkv
-320597 tests/data/lavf/lavf.mkv
+75fab2bc491e9ff57c7dd41d9b79b962 *tests/data/lavf/lavf.mkv
+320513 tests/data/lavf/lavf.mkv
tests/data/lavf/lavf.mkv CRC=0xec6c3c68
diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment
index 809975da50..97fa449d09 100644
--- a/tests/ref/lavf/mkv_attachment
+++ b/tests/ref/lavf/mkv_attachment
@@ -1,3 +1,3 @@
-bcc4ace0ebdfd0eade8cb490d99185e5 *tests/data/lavf/lavf.mkv_attachment
-472752 tests/data/lavf/lavf.mkv_attachment
+b96896c281ad5873cf8e921a0b67cc94 *tests/data/lavf/lavf.mkv_attachment
+472668 tests/data/lavf/lavf.mkv_attachment
tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68
diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv
index 8434aae988..d48a80c6a3 100644
--- a/tests/ref/seek/lavf-mkv
+++ b/tests/ref/seek/lavf-mkv
@@ -1,48 +1,48 @@
-ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 845 size: 208
+ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 761 size: 208
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292477 size: 27834
+ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292393 size: 27834
ret: 0 st: 0 flags:0 ts: 0.788000
-ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292477 size: 27834
+ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292393 size: 27834
ret: 0 st: 0 flags:1 ts:-0.317000
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
ret:-1 st: 1 flags:0 ts: 2.577000
ret: 0 st: 1 flags:1 ts: 1.471000
-ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320318 size: 209
+ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320234 size: 209
ret: 0 st:-1 flags:0 ts: 0.365002
-ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147029 size: 27925
+ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146945 size: 27925
ret: 0 st:-1 flags:1 ts:-0.740831
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
ret:-1 st: 0 flags:0 ts: 2.153000
ret: 0 st: 0 flags:1 ts: 1.048000
-ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292477 size: 27834
+ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292393 size: 27834
ret: 0 st: 1 flags:0 ts:-0.058000
-ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 845 size: 208
+ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 761 size: 208
ret: 0 st: 1 flags:1 ts: 2.836000
-ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320318 size: 209
+ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320234 size: 209
ret:-1 st:-1 flags:0 ts: 1.730004
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147029 size: 27925
+ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146945 size: 27925
ret: 0 st: 0 flags:0 ts:-0.482000
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
ret: 0 st: 0 flags:1 ts: 2.413000
-ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292477 size: 27834
+ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292393 size: 27834
ret:-1 st: 1 flags:0 ts: 1.307000
ret: 0 st: 1 flags:1 ts: 0.201000
-ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 845 size: 208
+ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 761 size: 208
ret: 0 st:-1 flags:0 ts:-0.904994
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
ret: 0 st:-1 flags:1 ts: 1.989173
-ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292477 size: 27834
+ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292393 size: 27834
ret: 0 st: 0 flags:0 ts: 0.883000
-ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292477 size: 27834
+ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292393 size: 27834
ret: 0 st: 0 flags:1 ts:-0.222000
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
ret:-1 st: 1 flags:0 ts: 2.672000
ret: 0 st: 1 flags:1 ts: 1.566000
-ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320318 size: 209
+ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320234 size: 209
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147029 size: 27925
+ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146945 size: 27925
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1061 size: 27837
+ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 977 size: 27837
--
2.20.1
More information about the ffmpeg-devel
mailing list