mirror of
https://github.com/mpv-player/mpv
synced 2025-04-08 10:32:51 +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 demux_stream {
|
||||||
|
struct demuxer *demuxer;
|
||||||
int selected; // user wants packets from this stream
|
int selected; // user wants packets from this stream
|
||||||
int eof; // end of demuxed stream? (true if all buffer empty)
|
int eof; // end of demuxed stream? (true if all buffer empty)
|
||||||
int packs; // number of packets in buffer
|
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
|
.demuxer_id = demuxer_id, // may be overwritten by demuxer
|
||||||
.ds = talloc_zero(sh, struct demux_stream),
|
.ds = talloc_zero(sh, struct demux_stream),
|
||||||
};
|
};
|
||||||
|
sh->ds->demuxer = demuxer;
|
||||||
MP_TARRAY_APPEND(demuxer, demuxer->streams, demuxer->num_streams, sh);
|
MP_TARRAY_APPEND(demuxer, demuxer->streams, demuxer->num_streams, sh);
|
||||||
switch (sh->type) {
|
switch (sh->type) {
|
||||||
case STREAM_VIDEO: sh->video = talloc_zero(demuxer, struct sh_video); break;
|
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.
|
// 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,
|
int demux_add_packet(struct sh_stream *stream, demux_packet_t *dp)
|
||||||
demux_packet_t *dp)
|
|
||||||
{
|
{
|
||||||
struct demux_stream *ds = stream ? stream->ds : NULL;
|
struct demux_stream *ds = stream ? stream->ds : NULL;
|
||||||
if (!dp || !ds || !ds->selected) {
|
if (!dp || !ds || !ds->selected) {
|
||||||
talloc_free(dp);
|
talloc_free(dp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
struct demuxer *demuxer = ds->demuxer;
|
||||||
|
|
||||||
dp->stream = stream->index;
|
dp->stream = stream->index;
|
||||||
dp->next = NULL;
|
dp->next = NULL;
|
||||||
@ -196,12 +198,7 @@ int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
|
|||||||
// first packet in stream
|
// first packet in stream
|
||||||
ds->head = ds->tail = dp;
|
ds->head = ds->tail = dp;
|
||||||
}
|
}
|
||||||
/* ds_get_packets() can set ds->eof to 1 when another stream runs out of
|
// obviously not true anymore
|
||||||
* 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. */
|
|
||||||
ds->eof = 0;
|
ds->eof = 0;
|
||||||
|
|
||||||
// For video, PTS determination is not trivial, but for other media types
|
// 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)
|
if (stream->type != STREAM_VIDEO && dp->pts == MP_NOPTS_VALUE)
|
||||||
dp->pts = dp->dts;
|
dp->pts = dp->dts;
|
||||||
|
|
||||||
MP_DBG(demuxer, "DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%"PRIi64" "
|
if (mp_msg_test(demuxer->log, MSGL_DEBUG)) {
|
||||||
"[packs: A=%d V=%d S=%d]\n", stream_type_name(stream->type),
|
MP_DBG(demuxer, "DEMUX: Append packet to %s, len=%d pts=%5.3f pos="
|
||||||
dp->len, dp->pts, dp->pos, count_packs(demuxer, STREAM_AUDIO),
|
"%"PRIi64" [A=%d V=%d S=%d]\n", stream_type_name(stream->type),
|
||||||
count_packs(demuxer, STREAM_VIDEO), count_packs(demuxer, STREAM_SUB));
|
dp->len, dp->pts, dp->pos, count_packs(demuxer, STREAM_AUDIO),
|
||||||
|
count_packs(demuxer, STREAM_VIDEO), count_packs(demuxer, STREAM_SUB));
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,13 +317,6 @@ bool demux_has_packet(struct sh_stream *sh)
|
|||||||
return sh && sh->ds->head;
|
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.
|
// Return whether EOF was returned with an earlier packet read.
|
||||||
bool demux_stream_eof(struct sh_stream *sh)
|
bool demux_stream_eof(struct sh_stream *sh)
|
||||||
{
|
{
|
||||||
|
@ -226,8 +226,7 @@ typedef struct {
|
|||||||
|
|
||||||
void free_demuxer(struct demuxer *demuxer);
|
void free_demuxer(struct demuxer *demuxer);
|
||||||
|
|
||||||
int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
|
int demux_add_packet(struct sh_stream *stream, demux_packet_t *dp);
|
||||||
demux_packet_t *dp);
|
|
||||||
|
|
||||||
struct demux_packet *demux_read_packet(struct sh_stream *sh);
|
struct demux_packet *demux_read_packet(struct sh_stream *sh);
|
||||||
double demux_get_next_pts(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);
|
enum stream_type t, int id);
|
||||||
|
|
||||||
bool demuxer_stream_is_selected(struct demuxer *d, struct sh_stream *stream);
|
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,
|
bool demux_matroska_uid_cmp(struct matroska_segment_uid *a,
|
||||||
struct matroska_segment_uid *b);
|
struct matroska_segment_uid *b);
|
||||||
|
@ -193,7 +193,7 @@ static int d_fill_buffer(demuxer_t *demuxer)
|
|||||||
pkt->stream_pts = pts;
|
pkt->stream_pts = pts;
|
||||||
}
|
}
|
||||||
|
|
||||||
demuxer_add_packet(demuxer, sh, pkt);
|
demux_add_packet(sh, pkt);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -815,7 +815,7 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
|
|||||||
} else if (dp->dts != MP_NOPTS_VALUE) {
|
} else if (dp->dts != MP_NOPTS_VALUE) {
|
||||||
priv->last_pts = dp->dts * AV_TIME_BASE;
|
priv->last_pts = dp->dts * AV_TIME_BASE;
|
||||||
}
|
}
|
||||||
demuxer_add_packet(demux, stream, dp);
|
demux_add_packet(stream, dp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer)
|
|||||||
memcpy(dp->buffer, data.start, data.len);
|
memcpy(dp->buffer, data.start, data.len);
|
||||||
dp->pts = mf->curr_frame / mf->sh->fps;
|
dp->pts = mf->curr_frame / mf->sh->fps;
|
||||||
dp->keyframe = true;
|
dp->keyframe = true;
|
||||||
demuxer_add_packet(demuxer, demuxer->streams[0], dp);
|
demux_add_packet(demuxer->streams[0], dp);
|
||||||
}
|
}
|
||||||
talloc_free(data.start);
|
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->pos = mkv_d->last_filepos;
|
||||||
dp->keyframe = keyframe;
|
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,
|
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];
|
track->audio_timestamp[x * apk_usize / w];
|
||||||
dp->pos = track->audio_filepos; // all equal
|
dp->pos = track->audio_filepos; // all equal
|
||||||
dp->keyframe = !x; // Mark first packet as keyframe
|
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
|
} 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->pos = mkv_d->last_filepos;
|
||||||
dp->keyframe = keyframe;
|
dp->keyframe = keyframe;
|
||||||
demuxer_add_packet(demuxer, track->stream, dp);
|
demux_add_packet(track->stream, dp);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
error:
|
error:
|
||||||
@ -2426,7 +2426,7 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info)
|
|||||||
if (track->ms_compat)
|
if (track->ms_compat)
|
||||||
MPSWAP(double, dp->pts, dp->dts);
|
MPSWAP(double, dp->pts, dp->dts);
|
||||||
dp->duration = block_duration / 1e9;
|
dp->duration = block_duration / 1e9;
|
||||||
demuxer_add_packet(demuxer, stream, dp);
|
demux_add_packet(stream, dp);
|
||||||
}
|
}
|
||||||
talloc_free_children(track->parser_tmp);
|
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);
|
int len = stream_read(demuxer->stream, dp->buffer, dp->len);
|
||||||
demux_packet_shorten(dp, len);
|
demux_packet_shorten(dp, len);
|
||||||
demuxer_add_packet(demuxer, demuxer->streams[0], dp);
|
demux_add_packet(demuxer->streams[0], dp);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -800,7 +800,7 @@ static int d_fill_buffer(struct demuxer *demuxer)
|
|||||||
struct priv *p = demuxer->priv;
|
struct priv *p = demuxer->priv;
|
||||||
struct demux_packet *dp = demux_packet_list_fill(p->pkts, p->num_pkts,
|
struct demux_packet *dp = demux_packet_list_fill(p->pkts, p->num_pkts,
|
||||||
&p->current);
|
&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)
|
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++) {
|
for (int n = 0; n < demux->num_streams; n++) {
|
||||||
struct sh_stream *sh = demux->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))
|
demuxer_stream_is_selected(demux, sh))
|
||||||
{
|
{
|
||||||
if (sh->type == STREAM_AUDIO)
|
if (sh->type == STREAM_AUDIO)
|
||||||
@ -319,7 +319,7 @@ static int demux_tv_fill_buffer(demuxer_t *demux)
|
|||||||
dp=new_demux_packet(len);
|
dp=new_demux_packet(len);
|
||||||
dp->keyframe = true;
|
dp->keyframe = true;
|
||||||
dp->pts=tvh->functions->grab_audio_frame(tvh->priv, dp->buffer,len);
|
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 =================== */
|
/* ================== ADD VIDEO PACKET =================== */
|
||||||
@ -331,7 +331,7 @@ static int demux_tv_fill_buffer(demuxer_t *demux)
|
|||||||
dp=new_demux_packet(len);
|
dp=new_demux_packet(len);
|
||||||
dp->keyframe = true;
|
dp->keyframe = true;
|
||||||
dp->pts=tvh->functions->grab_video_frame(tvh->priv, dp->buffer, len);
|
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);
|
if (tvh->tv_param->scan) tv_scan(tvh);
|
||||||
|
Loading…
Reference in New Issue
Block a user