[FFmpeg-devel,36/37] avformat/matroskadec: Use file offsets for level 1 elements

Submitted by Andreas Rheinhardt on May 16, 2019, 10:30 p.m.

Details

Message ID 20190516223018.30827-37-andreas.rheinhardt@gmail.com
State Accepted
Commit 730ac1ae803925777702eeaef4d1b8b796126e8f
Headers show

Commit Message

Andreas Rheinhardt May 16, 2019, 10:30 p.m.
This commit converts the MatroskaLevel1Element struct to use file-based
offsets, as opposed to the current practice of using offsets relative to
the beginning of the segment in it. This also includes a change from
uint64_t to int64_t.

This is in preparation to another patch that improves the check for
duplicate level 1 elements.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavformat/matroskadec.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index d200dc9061..0bf6477b0e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -330,7 +330,7 @@  typedef struct MatroskaCluster {
 } MatroskaCluster;
 
 typedef struct MatroskaLevel1Element {
-    uint64_t pos;
+    int64_t  pos;
     uint32_t id;
     int parsed;
 } MatroskaLevel1Element;
@@ -1787,16 +1787,14 @@  static void matroska_convert_tags(AVFormatContext *s)
 }
 
 static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska,
-                                         uint64_t pos)
+                                         int64_t pos)
 {
     uint32_t saved_id  = matroska->current_id;
     int64_t before_pos = avio_tell(matroska->ctx->pb);
-    int64_t offset;
     int ret = 0;
 
     /* seek */
-    offset = pos + matroska->segment_start;
-    if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) == offset) {
+    if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
         /* We don't want to lose our seekhead level, so we add
          * a dummy. This is a crude hack. */
         if (matroska->num_levels == EBML_MAX_DEPTH) {
@@ -1834,8 +1832,8 @@  static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
 
     for (i = 0; i < seekhead_list->nb_elem; i++) {
         MatroskaSeekhead *seekheads = seekhead_list->elem;
-        uint32_t id  = seekheads[i].id;
-        uint64_t pos = seekheads[i].pos;
+        uint32_t id = seekheads[i].id;
+        int64_t pos = seekheads[i].pos + matroska->segment_start;
 
         MatroskaLevel1Element *elem = matroska_find_level1_elem(matroska, id);
         if (!elem || elem->parsed)