summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c81
1 files changed, 52 insertions, 29 deletions
diff --git a/mplayer.c b/mplayer.c
index ad18f62730..0bb7f2a4b9 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -448,7 +448,8 @@ static void print_file_properties(struct MPContext *mpctx, const char *filename)
double video_start_pts = MP_NOPTS_VALUE;
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_FILENAME=%s\n",
filename);
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXER=%s\n",
+ if (mpctx->demuxer)
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXER=%s\n",
mpctx->demuxer->desc->name);
if (mpctx->sh_video) {
/* Assume FOURCC if all bytes >= 0x20 (' ') */
@@ -516,9 +517,9 @@ static void print_file_properties(struct MPContext *mpctx, const char *filename)
talloc_free(name);
}
}
+ for (int n = 0; n < mpctx->demuxer->num_streams; n++)
+ print_stream(mpctx, mpctx->demuxer->streams[n]);
}
- for (int n = 0; n < mpctx->demuxer->num_streams; n++)
- print_stream(mpctx, mpctx->demuxer->streams[n]);
}
/// step size of mixer changes
@@ -2551,7 +2552,9 @@ void pause_player(struct MPContext *mpctx)
if (mpctx->ao && mpctx->sh_audio)
ao_pause(mpctx->ao); // pause audio, keep data if possible
- print_status(mpctx, MP_NOPTS_VALUE, false);
+ // Only print status if there's actually a file being played.
+ if (mpctx->demuxer)
+ print_status(mpctx, MP_NOPTS_VALUE, false);
if (!mpctx->opts.quiet)
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_PAUSED\n");
@@ -2683,6 +2686,9 @@ static int seek(MPContext *mpctx, struct seek_params seek,
{
struct MPOpts *opts = &mpctx->opts;
+ if (!mpctx->demuxer)
+ return -1;
+
if (mpctx->stop_play == AT_END_OF_FILE)
mpctx->stop_play = KEEP_PLAYING;
bool hr_seek = mpctx->demuxer->accurate_seek && opts->correct_pts;
@@ -2816,10 +2822,13 @@ void queue_seek(struct MPContext *mpctx, enum seek_type type, double amount,
double get_time_length(struct MPContext *mpctx)
{
+ struct demuxer *demuxer = mpctx->demuxer;
+ if (!demuxer)
+ return 0;
+
if (mpctx->timeline)
return mpctx->timeline[mpctx->num_timeline_parts].start;
- struct demuxer *demuxer = mpctx->demuxer;
double get_time_ans;
// <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW
if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,
@@ -2846,6 +2855,8 @@ double get_time_length(struct MPContext *mpctx)
double get_current_time(struct MPContext *mpctx)
{
struct demuxer *demuxer = mpctx->demuxer;
+ if (!demuxer)
+ return 0;
if (demuxer->stream_pts != MP_NOPTS_VALUE)
return demuxer->stream_pts;
if (mpctx->sh_video) {
@@ -2862,6 +2873,8 @@ double get_current_time(struct MPContext *mpctx)
int get_percent_pos(struct MPContext *mpctx)
{
struct demuxer *demuxer = mpctx->demuxer;
+ if (!demuxer)
+ return 0;
int ans = 0;
if (mpctx->timeline)
ans = get_current_time(mpctx) * 100 /
@@ -2888,15 +2901,17 @@ int get_percent_pos(struct MPContext *mpctx)
int get_current_chapter(struct MPContext *mpctx)
{
double current_pts = get_current_time(mpctx);
- if (!mpctx->chapters)
+ if (mpctx->chapters) {
+ int i;
+ for (i = 1; i < mpctx->num_chapters; i++)
+ if (current_pts < mpctx->chapters[i].start)
+ break;
+ return FFMAX(mpctx->last_chapter_seek, i - 1);
+ }
+ if (mpctx->demuxer)
return FFMAX(mpctx->last_chapter_seek,
demuxer_get_current_chapter(mpctx->demuxer, current_pts));
-
- int i;
- for (i = 1; i < mpctx->num_chapters; i++)
- if (current_pts < mpctx->chapters[i].start)
- break;
- return FFMAX(mpctx->last_chapter_seek, i - 1);
+ return -2;
}
char *chapter_display_name(struct MPContext *mpctx, int chapter)
@@ -2918,30 +2933,46 @@ char *chapter_display_name(struct MPContext *mpctx, int chapter)
// returns NULL if chapter name unavailable
char *chapter_name(struct MPContext *mpctx, int chapter)
{
- if (!mpctx->chapters)
+ if (mpctx->chapters)
+ return talloc_strdup(NULL, mpctx->chapters[chapter].name);
+ if (mpctx->demuxer)
return demuxer_chapter_name(mpctx->demuxer, chapter);
- return talloc_strdup(NULL, mpctx->chapters[chapter].name);
+ return NULL;
}
-// returns the start of the chapter in seconds
+// returns the start of the chapter in seconds (-1 if unavailable)
double chapter_start_time(struct MPContext *mpctx, int chapter)
{
- if (!mpctx->chapters)
+ if (mpctx->chapters)
+ return mpctx->chapters[chapter].start;
+ if (mpctx->demuxer)
return demuxer_chapter_time(mpctx->demuxer, chapter, NULL);
- return mpctx->chapters[chapter].start;
+ return -1;
}
int get_chapter_count(struct MPContext *mpctx)
{
- if (!mpctx->chapters)
+ if (mpctx->chapters)
+ return mpctx->num_chapters;
+ if (mpctx->demuxer)
return demuxer_chapter_count(mpctx->demuxer);
- return mpctx->num_chapters;
+ return 0;
}
int seek_chapter(struct MPContext *mpctx, int chapter, double *seek_pts)
{
mpctx->last_chapter_seek = -2;
- if (!mpctx->chapters) {
+ if (mpctx->chapters) {
+ if (chapter >= mpctx->num_chapters)
+ return -1;
+ if (chapter < 0)
+ chapter = 0;
+ *seek_pts = mpctx->chapters[chapter].start;
+ mpctx->last_chapter_seek = chapter;
+ mpctx->last_chapter_pts = *seek_pts;
+ return chapter;
+ }
+ if (mpctx->demuxer) {
int res = demuxer_seek_chapter(mpctx->demuxer, chapter, seek_pts);
if (res >= 0) {
if (*seek_pts == -1)
@@ -2953,15 +2984,7 @@ int seek_chapter(struct MPContext *mpctx, int chapter, double *seek_pts)
}
return res;
}
-
- if (chapter >= mpctx->num_chapters)
- return -1;
- if (chapter < 0)
- chapter = 0;
- *seek_pts = mpctx->chapters[chapter].start;
- mpctx->last_chapter_seek = chapter;
- mpctx->last_chapter_pts = *seek_pts;
- return chapter;
+ return -1;
}