mirror of
https://github.com/mpv-player/mpv
synced 2025-03-22 11:18:32 +00:00
demux: return stream file size differently, rip out stream ctrls
The stream size return was the only thing that still required doing STREAM_CTRLs from frontend through the demuxer layer. This can be done much easier, so rip it out. Also rip out the now unused infrastructure for STREAM_CTRLs via demuxer layer.
This commit is contained in:
parent
f77515ebaf
commit
b298140b07
@ -1878,6 +1878,7 @@ static struct demux_packet *dequeue_packet(struct demux_stream *ds)
|
||||
// This implies this function is actually called from "the" user thread.
|
||||
if (pkt->pos >= ds->in->d_user->filepos)
|
||||
ds->in->d_user->filepos = pkt->pos;
|
||||
ds->in->d_user->filesize = ds->in->stream_size;
|
||||
|
||||
pkt->pts = MP_ADD_PTS(pkt->pts, ds->in->ts_offset);
|
||||
pkt->dts = MP_ADD_PTS(pkt->dts, ds->in->ts_offset);
|
||||
@ -3114,31 +3115,10 @@ static void update_cache(struct demux_internal *in)
|
||||
pthread_mutex_unlock(&in->lock);
|
||||
}
|
||||
|
||||
// must be called locked
|
||||
static int cached_stream_control(struct demux_internal *in, int cmd, void *arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case STREAM_CTRL_GET_SIZE:
|
||||
if (in->stream_size < 0)
|
||||
return STREAM_UNSUPPORTED;
|
||||
*(int64_t *)arg = in->stream_size;
|
||||
return STREAM_OK;
|
||||
}
|
||||
return STREAM_ERROR;
|
||||
}
|
||||
|
||||
// must be called locked
|
||||
static int cached_demux_control(struct demux_internal *in, int cmd, void *arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case DEMUXER_CTRL_STREAM_CTRL: {
|
||||
struct demux_ctrl_stream_ctrl *c = arg;
|
||||
int r = cached_stream_control(in, c->ctrl, c->arg);
|
||||
if (r == STREAM_ERROR)
|
||||
break;
|
||||
c->res = r;
|
||||
return CONTROL_OK;
|
||||
}
|
||||
case DEMUXER_CTRL_GET_BITRATE_STATS: {
|
||||
double *rates = arg;
|
||||
for (int n = 0; n < STREAM_TYPE_COUNT; n++)
|
||||
@ -3217,14 +3197,6 @@ static void thread_demux_control(void *p)
|
||||
|
||||
pthread_mutex_unlock(&in->lock);
|
||||
|
||||
if (cmd == DEMUXER_CTRL_STREAM_CTRL) {
|
||||
struct demux_ctrl_stream_ctrl *c = arg;
|
||||
if (in->threading)
|
||||
MP_VERBOSE(demuxer, "blocking for STREAM_CTRL %d\n", c->ctrl);
|
||||
c->res = stream_control(demuxer->stream, c->ctrl, c->arg);
|
||||
if (c->res != STREAM_UNSUPPORTED)
|
||||
r = CONTROL_OK;
|
||||
}
|
||||
if (r != CONTROL_OK) {
|
||||
if (in->threading)
|
||||
MP_VERBOSE(demuxer, "blocking for DEMUXER_CTRL %d\n", cmd);
|
||||
@ -3272,13 +3244,6 @@ int demux_control(demuxer_t *demuxer, int cmd, void *arg)
|
||||
return r;
|
||||
}
|
||||
|
||||
int demux_stream_control(demuxer_t *demuxer, int ctrl, void *arg)
|
||||
{
|
||||
struct demux_ctrl_stream_ctrl c = {ctrl, arg, STREAM_UNSUPPORTED};
|
||||
demux_control(demuxer, DEMUXER_CTRL_STREAM_CTRL, &c);
|
||||
return c.res;
|
||||
}
|
||||
|
||||
bool demux_cancel_test(struct demuxer *demuxer)
|
||||
{
|
||||
return mp_cancel_test(demuxer->cancel);
|
||||
|
@ -32,8 +32,6 @@
|
||||
|
||||
enum demux_ctrl {
|
||||
DEMUXER_CTRL_SWITCHED_TRACKS = 1,
|
||||
DEMUXER_CTRL_IDENTIFY_PROGRAM,
|
||||
DEMUXER_CTRL_STREAM_CTRL,
|
||||
DEMUXER_CTRL_GET_READER_STATE,
|
||||
DEMUXER_CTRL_GET_BITRATE_STATS, // double[STREAM_TYPE_COUNT]
|
||||
DEMUXER_CTRL_REPLACE_STREAM,
|
||||
@ -192,6 +190,7 @@ typedef struct demuxer {
|
||||
const demuxer_desc_t *desc; ///< Demuxer description structure
|
||||
const char *filetype; // format name when not identified by demuxer (libavformat)
|
||||
int64_t filepos; // input stream current pos.
|
||||
int64_t filesize;
|
||||
char *filename; // same as stream->url
|
||||
bool seekable;
|
||||
bool partially_seekable; // true if _maybe_ seekable; implies seekable=true
|
||||
@ -243,7 +242,6 @@ typedef struct demuxer {
|
||||
|
||||
// Since the demuxer can run in its own thread, and the stream is not
|
||||
// thread-safe, only the demuxer is allowed to access the stream directly.
|
||||
// You can freely use demux_stream_control() to send STREAM_CTRLs.
|
||||
// Also note that the stream can get replaced if fully_read is set.
|
||||
struct stream *stream;
|
||||
} demuxer_t;
|
||||
@ -308,8 +306,6 @@ int demuxer_add_chapter(demuxer_t *demuxer, char *name,
|
||||
void demux_set_stream_tags(struct demuxer *demuxer, struct sh_stream *sh,
|
||||
struct mp_tags *tags);
|
||||
|
||||
int demux_stream_control(demuxer_t *demuxer, int ctrl, void *arg);
|
||||
|
||||
void demux_metadata_changed(demuxer_t *demuxer);
|
||||
void demux_update(demuxer_t *demuxer);
|
||||
|
||||
|
@ -557,9 +557,7 @@ static int mp_property_file_size(void *ctx, struct m_property *prop,
|
||||
if (!mpctx->demuxer)
|
||||
return M_PROPERTY_UNAVAILABLE;
|
||||
|
||||
int64_t size;
|
||||
if (demux_stream_control(mpctx->demuxer, STREAM_CTRL_GET_SIZE, &size) < 1)
|
||||
return M_PROPERTY_UNAVAILABLE;
|
||||
int64_t size = mpctx->demuxer->filesize;
|
||||
|
||||
if (action == M_PROPERTY_PRINT) {
|
||||
*(char **)arg = format_file_size(size);
|
||||
|
@ -519,11 +519,9 @@ double get_current_pos_ratio(struct MPContext *mpctx, bool use_range)
|
||||
if (len > 0)
|
||||
ans = MPCLAMP((pos - start) / len, 0, 1);
|
||||
if (ans < 0 || demuxer->ts_resets_possible) {
|
||||
int64_t size;
|
||||
if (demux_stream_control(demuxer, STREAM_CTRL_GET_SIZE, &size) > 0) {
|
||||
if (size > 0 && demuxer->filepos >= 0)
|
||||
ans = MPCLAMP(demuxer->filepos / (double)size, 0, 1);
|
||||
}
|
||||
int64_t size = demuxer->filesize;
|
||||
if (size > 0 && demuxer->filepos >= 0)
|
||||
ans = MPCLAMP(demuxer->filepos / (double)size, 0, 1);
|
||||
}
|
||||
if (use_range) {
|
||||
if (mpctx->opts->play_frames > 0)
|
||||
|
Loading…
Reference in New Issue
Block a user