mirror of
https://github.com/mpv-player/mpv
synced 2025-03-30 07:18:17 +00:00
demux: minor simplification to internal API
Also some other unrelated minor changes.
This commit is contained in:
parent
de71b50249
commit
37085788e4
@ -80,6 +80,7 @@ const demuxer_desc_t *const demuxer_list[] = {
|
||||
};
|
||||
|
||||
struct demux_stream {
|
||||
struct demuxer *demuxer;
|
||||
int selected; // user wants packets from this stream
|
||||
int eof; // end of demuxed stream? (true if all buffer empty)
|
||||
int packs; // number of packets in buffer
|
||||
@ -125,6 +126,7 @@ struct sh_stream *new_sh_stream(demuxer_t *demuxer, enum stream_type type)
|
||||
.demuxer_id = demuxer_id, // may be overwritten by demuxer
|
||||
.ds = talloc_zero(sh, struct demux_stream),
|
||||
};
|
||||
sh->ds->demuxer = demuxer;
|
||||
MP_TARRAY_APPEND(demuxer, demuxer->streams, demuxer->num_streams, sh);
|
||||
switch (sh->type) {
|
||||
case STREAM_VIDEO: sh->video = talloc_zero(demuxer, struct sh_video); break;
|
||||
@ -174,14 +176,14 @@ static int count_bytes(struct demuxer *demux, enum stream_type type)
|
||||
}
|
||||
|
||||
// Returns the same value as demuxer->fill_buffer: 1 ok, 0 EOF/not selected.
|
||||
int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
|
||||
demux_packet_t *dp)
|
||||
int demux_add_packet(struct sh_stream *stream, demux_packet_t *dp)
|
||||
{
|
||||
struct demux_stream *ds = stream ? stream->ds : NULL;
|
||||
if (!dp || !ds || !ds->selected) {
|
||||
talloc_free(dp);
|
||||
return 0;
|
||||
}
|
||||
struct demuxer *demuxer = ds->demuxer;
|
||||
|
||||
dp->stream = stream->index;
|
||||
dp->next = NULL;
|
||||
@ -196,12 +198,7 @@ int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
|
||||
// first packet in stream
|
||||
ds->head = ds->tail = dp;
|
||||
}
|
||||
/* ds_get_packets() can set ds->eof to 1 when another stream runs out of
|
||||
* buffer space. That makes sense because in that situation the calling
|
||||
* code should not count on being able to demux more packets from this
|
||||
* stream. (Can happen with e.g. badly interleaved files.)
|
||||
* In this case, we didn't necessarily reach EOF, and new packet can
|
||||
* appear. */
|
||||
// obviously not true anymore
|
||||
ds->eof = 0;
|
||||
|
||||
// For video, PTS determination is not trivial, but for other media types
|
||||
@ -209,10 +206,12 @@ int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
|
||||
if (stream->type != STREAM_VIDEO && dp->pts == MP_NOPTS_VALUE)
|
||||
dp->pts = dp->dts;
|
||||
|
||||
MP_DBG(demuxer, "DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%"PRIi64" "
|
||||
"[packs: A=%d V=%d S=%d]\n", stream_type_name(stream->type),
|
||||
dp->len, dp->pts, dp->pos, count_packs(demuxer, STREAM_AUDIO),
|
||||
count_packs(demuxer, STREAM_VIDEO), count_packs(demuxer, STREAM_SUB));
|
||||
if (mp_msg_test(demuxer->log, MSGL_DEBUG)) {
|
||||
MP_DBG(demuxer, "DEMUX: Append packet to %s, len=%d pts=%5.3f pos="
|
||||
"%"PRIi64" [A=%d V=%d S=%d]\n", stream_type_name(stream->type),
|
||||
dp->len, dp->pts, dp->pos, count_packs(demuxer, STREAM_AUDIO),
|
||||
count_packs(demuxer, STREAM_VIDEO), count_packs(demuxer, STREAM_SUB));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -318,13 +317,6 @@ bool demux_has_packet(struct sh_stream *sh)
|
||||
return sh && sh->ds->head;
|
||||
}
|
||||
|
||||
// Same as demux_has_packet, but to be called internally by demuxers, as
|
||||
// opposed to the user of the demuxer.
|
||||
bool demuxer_stream_has_packets_queued(struct demuxer *d, struct sh_stream *stream)
|
||||
{
|
||||
return demux_has_packet(stream);
|
||||
}
|
||||
|
||||
// Return whether EOF was returned with an earlier packet read.
|
||||
bool demux_stream_eof(struct sh_stream *sh)
|
||||
{
|
||||
|
@ -226,8 +226,7 @@ typedef struct {
|
||||
|
||||
void free_demuxer(struct demuxer *demuxer);
|
||||
|
||||
int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
|
||||
demux_packet_t *dp);
|
||||
int demux_add_packet(struct sh_stream *stream, demux_packet_t *dp);
|
||||
|
||||
struct demux_packet *demux_read_packet(struct sh_stream *sh);
|
||||
double demux_get_next_pts(struct sh_stream *sh);
|
||||
@ -267,7 +266,6 @@ struct sh_stream *demuxer_stream_by_demuxer_id(struct demuxer *d,
|
||||
enum stream_type t, int id);
|
||||
|
||||
bool demuxer_stream_is_selected(struct demuxer *d, struct sh_stream *stream);
|
||||
bool demuxer_stream_has_packets_queued(struct demuxer *d, struct sh_stream *stream);
|
||||
|
||||
bool demux_matroska_uid_cmp(struct matroska_segment_uid *a,
|
||||
struct matroska_segment_uid *b);
|
||||
|
@ -193,7 +193,7 @@ static int d_fill_buffer(demuxer_t *demuxer)
|
||||
pkt->stream_pts = pts;
|
||||
}
|
||||
|
||||
demuxer_add_packet(demuxer, sh, pkt);
|
||||
demux_add_packet(sh, pkt);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -815,7 +815,7 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
|
||||
} else if (dp->dts != MP_NOPTS_VALUE) {
|
||||
priv->last_pts = dp->dts * AV_TIME_BASE;
|
||||
}
|
||||
demuxer_add_packet(demux, stream, dp);
|
||||
demux_add_packet(stream, dp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer)
|
||||
memcpy(dp->buffer, data.start, data.len);
|
||||
dp->pts = mf->curr_frame / mf->sh->fps;
|
||||
dp->keyframe = true;
|
||||
demuxer_add_packet(demuxer, demuxer->streams[0], dp);
|
||||
demux_add_packet(demuxer->streams[0], dp);
|
||||
}
|
||||
talloc_free(data.start);
|
||||
}
|
||||
|
@ -1984,7 +1984,7 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
|
||||
dp->pos = mkv_d->last_filepos;
|
||||
dp->keyframe = keyframe;
|
||||
|
||||
demuxer_add_packet(demuxer, track->stream, dp);
|
||||
demux_add_packet(track->stream, dp);
|
||||
}
|
||||
|
||||
static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
|
||||
@ -2094,7 +2094,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
|
||||
track->audio_timestamp[x * apk_usize / w];
|
||||
dp->pos = track->audio_filepos; // all equal
|
||||
dp->keyframe = !x; // Mark first packet as keyframe
|
||||
demuxer_add_packet(demuxer, track->stream, dp);
|
||||
demux_add_packet(track->stream, dp);
|
||||
}
|
||||
}
|
||||
} else { // Not a codec that requires reordering
|
||||
@ -2107,7 +2107,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
|
||||
|
||||
dp->pos = mkv_d->last_filepos;
|
||||
dp->keyframe = keyframe;
|
||||
demuxer_add_packet(demuxer, track->stream, dp);
|
||||
demux_add_packet(track->stream, dp);
|
||||
}
|
||||
return;
|
||||
error:
|
||||
@ -2426,7 +2426,7 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info)
|
||||
if (track->ms_compat)
|
||||
MPSWAP(double, dp->pts, dp->dts);
|
||||
dp->duration = block_duration / 1e9;
|
||||
demuxer_add_packet(demuxer, stream, dp);
|
||||
demux_add_packet(stream, dp);
|
||||
}
|
||||
talloc_free_children(track->parser_tmp);
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ static int raw_fill_buffer(demuxer_t *demuxer)
|
||||
|
||||
int len = stream_read(demuxer->stream, dp->buffer, dp->len);
|
||||
demux_packet_shorten(dp, len);
|
||||
demuxer_add_packet(demuxer, demuxer->streams[0], dp);
|
||||
demux_add_packet(demuxer->streams[0], dp);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -800,7 +800,7 @@ static int d_fill_buffer(struct demuxer *demuxer)
|
||||
struct priv *p = demuxer->priv;
|
||||
struct demux_packet *dp = demux_packet_list_fill(p->pkts, p->num_pkts,
|
||||
&p->current);
|
||||
return demuxer_add_packet(demuxer, p->sh, dp);
|
||||
return demux_add_packet(p->sh, dp);
|
||||
}
|
||||
|
||||
static void d_seek(struct demuxer *demuxer, float secs, int flags)
|
||||
|
@ -298,7 +298,7 @@ static int demux_tv_fill_buffer(demuxer_t *demux)
|
||||
|
||||
for (int n = 0; n < demux->num_streams; n++) {
|
||||
struct sh_stream *sh = demux->streams[n];
|
||||
if (!demuxer_stream_has_packets_queued(demux, sh) &&
|
||||
if (!demux_has_packet(sh) &&
|
||||
demuxer_stream_is_selected(demux, sh))
|
||||
{
|
||||
if (sh->type == STREAM_AUDIO)
|
||||
@ -319,7 +319,7 @@ static int demux_tv_fill_buffer(demuxer_t *demux)
|
||||
dp=new_demux_packet(len);
|
||||
dp->keyframe = true;
|
||||
dp->pts=tvh->functions->grab_audio_frame(tvh->priv, dp->buffer,len);
|
||||
demuxer_add_packet(demux, want_audio, dp);
|
||||
demux_add_packet(want_audio, dp);
|
||||
}
|
||||
|
||||
/* ================== ADD VIDEO PACKET =================== */
|
||||
@ -331,7 +331,7 @@ static int demux_tv_fill_buffer(demuxer_t *demux)
|
||||
dp=new_demux_packet(len);
|
||||
dp->keyframe = true;
|
||||
dp->pts=tvh->functions->grab_video_frame(tvh->priv, dp->buffer, len);
|
||||
demuxer_add_packet(demux, want_video, dp);
|
||||
demux_add_packet(want_video, dp);
|
||||
}
|
||||
|
||||
if (tvh->tv_param->scan) tv_scan(tvh);
|
||||
|
Loading…
Reference in New Issue
Block a user