player: avoid stalling when starting a network stream

Starting a network stream could stall by executing uncacheable stream
control requests (STREAM_CTRL_GET_LANG and STREAM_CTRL_GET_DVD_INFO).
Being uncacheable means the player has to wait until the cache is done
reading the current block of data. These requests can't be cached
because they're too complicated, so the only way to avoid them is
special casing the DVD and Bluray streams (which are the only things
which need these requests), and not doing them in other cases.

(This is kind of inelegant, but so is the rest of the DVD/BD code.)
This commit is contained in:
wm4 2014-01-14 22:02:52 +01:00
parent 9dc9254da2
commit 5196b03fb2
3 changed files with 9 additions and 2 deletions

View File

@ -443,13 +443,16 @@ static struct track *add_stream_track(struct MPContext *mpctx,
track->preloaded = !!stream->sub->track; track->preloaded = !!stream->sub->track;
// Needed for DVD and Blu-ray. // Needed for DVD and Blu-ray.
if (!track->lang) { struct stream *st = track->demuxer->stream;
if (!track->lang && (st->uncached_type == STREAMTYPE_BLURAY ||
st->uncached_type == STREAMTYPE_DVD))
{
struct stream_lang_req req = { struct stream_lang_req req = {
.type = track->type, .type = track->type,
.id = map_id_from_demuxer(track->demuxer, track->type, .id = map_id_from_demuxer(track->demuxer, track->type,
track->demuxer_id) track->demuxer_id)
}; };
stream_control(track->demuxer->stream, STREAM_CTRL_GET_LANG, &req); stream_control(st, STREAM_CTRL_GET_LANG, &req);
if (req.name[0]) if (req.name[0])
track->lang = talloc_strdup(track, req.name); track->lang = talloc_strdup(track, req.name);
} }
@ -472,6 +475,8 @@ static void add_dvd_tracks(struct MPContext *mpctx)
struct demuxer *demuxer = mpctx->demuxer; struct demuxer *demuxer = mpctx->demuxer;
struct stream *stream = demuxer->stream; struct stream *stream = demuxer->stream;
struct stream_dvd_info_req info; struct stream_dvd_info_req info;
if (stream->uncached_type != STREAMTYPE_DVD)
return;
if (stream_control(stream, STREAM_CTRL_GET_DVD_INFO, &info) > 0) { if (stream_control(stream, STREAM_CTRL_GET_DVD_INFO, &info) > 0) {
for (int n = 0; n < info.num_subs; n++) { for (int n = 0; n < info.num_subs; n++) {
struct track *track = talloc_ptrtype(NULL, track); struct track *track = talloc_ptrtype(NULL, track);

View File

@ -35,6 +35,7 @@ enum streamtype {
STREAMTYPE_RADIO, STREAMTYPE_RADIO,
STREAMTYPE_DVB, STREAMTYPE_DVB,
STREAMTYPE_DVD, STREAMTYPE_DVD,
STREAMTYPE_BLURAY,
STREAMTYPE_PVR, STREAMTYPE_PVR,
STREAMTYPE_TV, STREAMTYPE_TV,
STREAMTYPE_MF, STREAMTYPE_MF,

View File

@ -390,6 +390,7 @@ err_no_info:
b->current_angle = angle; b->current_angle = angle;
b->current_title = title; b->current_title = title;
s->type = STREAMTYPE_BLURAY;
s->end_pos = title_size; s->end_pos = title_size;
s->sector_size = BLURAY_SECTOR_SIZE; s->sector_size = BLURAY_SECTOR_SIZE;
s->flags = MP_STREAM_SEEK; s->flags = MP_STREAM_SEEK;