summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux/demux.c4
-rw-r--r--demux/demux_lavf.c4
-rw-r--r--demux/demux_mkv.c11
-rw-r--r--demux/demux_packet.h2
-rw-r--r--mpvcore/player/playloop.c2
5 files changed, 13 insertions, 10 deletions
diff --git a/demux/demux.c b/demux/demux.c
index d9cf3b37dd..983a96c90a 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -133,6 +133,7 @@ static struct demux_packet *create_packet(size_t len)
.pts = MP_NOPTS_VALUE,
.duration = -1,
.stream_pts = MP_NOPTS_VALUE,
+ .pos = -1,
};
return dp;
}
@@ -339,6 +340,9 @@ int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
* appear. */
ds->eof = 0;
+ if (dp->pos >= 0)
+ demuxer->filepos = dp->pos;
+
mp_dbg(MSGT_DEMUXER, MSGL_DBG2,
"DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%"PRIu64" "
"[packs: A=%d V=%d S=%d]\n", stream_type_name(stream->type),
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index 946c76fb84..33c8d1b667 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -707,8 +707,6 @@ static int read_more_av_packets(demuxer_t *demux)
if (priv->num_packets >= MAX_PKT_QUEUE)
return -1;
- demux->filepos = stream_tell(demux->stream);
-
AVPacket *pkt = talloc(NULL, AVPacket);
if (av_read_frame(priv->avfc, pkt) < 0) {
talloc_free(pkt);
@@ -795,7 +793,7 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
if (pkt->convergence_duration > 0)
dp->duration = pkt->convergence_duration * av_q2d(st->time_base);
}
- dp->pos = demux->filepos;
+ dp->pos = pkt->pos;
dp->keyframe = pkt->flags & AV_PKT_FLAG_KEY;
// Use only one stream for stream_pts, otherwise PTS might be jumpy.
if (stream->type == STREAM_VIDEO) {
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 092b86fa62..5258bee5d5 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -2004,7 +2004,7 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
track->stream->video->bih->biCompression,
&track->rv_kf_base, &track->rv_kf_pts, NULL);
}
- dp->pos = demuxer->filepos;
+ dp->pos = mkv_d->last_filepos;
dp->keyframe = keyframe;
demuxer_add_packet(demuxer, track->stream, dp);
@@ -2083,7 +2083,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
(track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts);
track->ra_pts = mkv_d->last_pts;
if (track->sub_packet_cnt == 0)
- track->audio_filepos = demuxer->filepos;
+ track->audio_filepos = mkv_d->last_filepos;
if (++(track->sub_packet_cnt) == sph) {
int apk_usize = track->stream->audio->wf->nBlockAlign;
track->sub_packet_cnt = 0;
@@ -2108,7 +2108,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
dp->pts = mkv_d->last_pts;
track->ra_pts = mkv_d->last_pts;
- dp->pos = demuxer->filepos;
+ dp->pos = mkv_d->last_filepos;
dp->keyframe = keyframe;
demuxer_add_packet(demuxer, track->stream, dp);
}
@@ -2225,6 +2225,7 @@ struct block_info {
mkv_track_t *track;
bstr data;
void *alloc;
+ int64_t filepos;
};
static void free_block(struct block_info *block)
@@ -2260,7 +2261,7 @@ static int read_block(demuxer_t *demuxer, struct block_info *block)
if (!block->alloc)
goto exit;
block->data = (bstr){block->alloc, length};
- demuxer->filepos = stream_tell(s);
+ block->filepos = stream_tell(s);
if (stream_read(s, block->data.start, block->data.len) != block->data.len)
goto exit;
@@ -2350,7 +2351,7 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info)
if (use_this_block) {
mkv_d->last_pts = current_pts;
- mkv_d->last_filepos = demuxer->filepos;
+ mkv_d->last_filepos = block_info->filepos;
for (int i = 0; i < laces; i++) {
bstr block = bstr_splice(data, 0, lace_size[i]);
diff --git a/demux/demux_packet.h b/demux/demux_packet.h
index 25731d914a..0d1a6e6f03 100644
--- a/demux/demux_packet.h
+++ b/demux/demux_packet.h
@@ -28,7 +28,7 @@ typedef struct demux_packet {
double pts;
double duration;
double stream_pts;
- int64_t pos; // position in index (AVI) or file (MPG)
+ int64_t pos; // position in source file byte stream
unsigned char *buffer;
bool keyframe;
struct demux_packet *next;
diff --git a/mpvcore/player/playloop.c b/mpvcore/player/playloop.c
index 9d5b4a5e25..9fef5c07b5 100644
--- a/mpvcore/player/playloop.c
+++ b/mpvcore/player/playloop.c
@@ -458,7 +458,7 @@ double get_current_pos_ratio(struct MPContext *mpctx, bool use_range)
} else {
struct stream *s = demuxer->stream;
int64_t size = s->end_pos - s->start_pos;
- int64_t fpos = demuxer->filepos > 0 ?
+ int64_t fpos = demuxer->filepos >= 0 ?
demuxer->filepos : stream_tell(demuxer->stream);
if (size > 0)
ans = MPCLAMP((double)(fpos - s->start_pos) / size, 0, 1);