summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-08-12 18:40:21 +0200
committerwm4 <wm4@nowhere>2012-08-16 17:17:49 +0200
commit41fbcee1f557c3ddbfefc79b2b1b4719c6442265 (patch)
tree6c15b7631ad817a68207d2d04e4969ec0e128a8a /mplayer.c
parentaebfbbf2bdda8e18beef90c16da97bd335f7d3b0 (diff)
downloadmpv-41fbcee1f557c3ddbfefc79b2b1b4719c6442265.tar.bz2
mpv-41fbcee1f557c3ddbfefc79b2b1b4719c6442265.tar.xz
Remove dvdnav support (DVD menus)
When the internal mplayer MPEG demuxer was removed (commit 1fde09db), the default demuxer when using dvdnav was set to libavformat. Now it turns out that this doesn't work with libavformat. It will terminate playback right after the audio runs out (instead of looping it like the video, or whatever it's supposed to do). I'm not sure what exactly the problem is, but since 1. even mplayer-svn can't handle DVD menus directly (missing highlights), 2. DVD menus are essentially worthless, and 3. I don't directly watch DVDs, don't bother with it and remove it. For basic playback, there's still libdvdread support. Also, use pkg-config for libdvdread, and drop support for in-tree libdvdread. Remove support for in-tree libdvdcss as well.
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c241
1 files changed, 2 insertions, 239 deletions
diff --git a/mplayer.c b/mplayer.c
index e280a1e20c..a15d9ea385 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -146,7 +146,6 @@ static int max_framesize = 0;
#ifdef CONFIG_DVDREAD
#include "stream/stream_dvd.h"
#endif
-#include "stream/stream_dvdnav.h"
#include "libmpcodecs/dec_audio.h"
#include "libmpcodecs/dec_video.h"
@@ -526,19 +525,6 @@ static void print_file_properties(struct MPContext *mpctx, const char *filename)
/// step size of mixer changes
int volstep = 3;
-#ifdef CONFIG_DVDNAV
-static void mp_dvdnav_context_free(MPContext *ctx)
-{
- if (ctx->nav_smpi)
- free_mp_image(ctx->nav_smpi);
- ctx->nav_smpi = NULL;
- free(ctx->nav_buffer);
- ctx->nav_buffer = NULL;
- ctx->nav_start = NULL;
- ctx->nav_in_size = 0;
-}
-#endif
-
static void uninit_subs(struct demuxer *demuxer)
{
for (int i = 0; i < MAX_S_STREAMS; i++) {
@@ -615,9 +601,6 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask)
mpctx->initialized_flags &= ~INITIALIZED_VO;
vo_destroy(mpctx->video_out);
mpctx->video_out = NULL;
-#ifdef CONFIG_DVDNAV
- mp_dvdnav_context_free(mpctx);
-#endif
}
// Must be after libvo uninit, as few vo drivers (svgalib) have tty code.
@@ -953,13 +936,6 @@ void init_vo_spudec(struct MPContext *mpctx)
}
#endif
-#ifdef CONFIG_DVDNAV
- if (vo_spudec == NULL && mpctx->stream->type == STREAMTYPE_DVDNAV) {
- unsigned int *palette = mp_dvdnav_get_spu_clut(mpctx->stream);
- vo_spudec = spudec_new_scaled(palette, width, height, NULL, 0);
- }
-#endif
-
if (vo_spudec == NULL) {
sh_sub_t *sh = mpctx->d_sub->sh;
vo_spudec = spudec_new_scaled(NULL, width, height, sh->extradata,
@@ -1854,149 +1830,6 @@ static int select_subtitle(MPContext *mpctx)
return found;
}
-#ifdef CONFIG_DVDNAV
-#ifndef FF_B_TYPE
-#define FF_B_TYPE 3
-#endif
-/// store decoded video image
-static mp_image_t *mp_dvdnav_copy_mpi(mp_image_t *to_mpi,
- mp_image_t *from_mpi)
-{
- mp_image_t *mpi;
-
- /// Do not store B-frames
- if (from_mpi->pict_type == FF_B_TYPE)
- return to_mpi;
-
- if (to_mpi &&
- to_mpi->w == from_mpi->w &&
- to_mpi->h == from_mpi->h &&
- to_mpi->imgfmt == from_mpi->imgfmt)
- mpi = to_mpi;
- else {
- if (to_mpi)
- free_mp_image(to_mpi);
- if (from_mpi->w == 0 || from_mpi->h == 0)
- return NULL;
- mpi = alloc_mpi(from_mpi->w, from_mpi->h, from_mpi->imgfmt);
- }
-
- copy_mpi(mpi, from_mpi);
- return mpi;
-}
-
-static void mp_dvdnav_reset_stream(MPContext *ctx)
-{
- struct MPOpts *opts = &ctx->opts;
- if (ctx->sh_video) {
- /// clear video pts
- ctx->d_video->pts = 0.0f;
- ctx->sh_video->pts = 0.0f;
- ctx->sh_video->i_pts = 0.0f;
- ctx->sh_video->last_pts = 0.0f;
- ctx->sh_video->num_buffered_pts = 0;
- ctx->sh_video->num_frames = 0;
- ctx->sh_video->num_frames_decoded = 0;
- ctx->sh_video->timer = 0.0f;
- ctx->sh_video->stream_delay = 0.0f;
- ctx->sh_video->timer = 0;
- ctx->demuxer->stream_pts = MP_NOPTS_VALUE;
- }
-
- if (ctx->sh_audio) {
- /// free audio packets and reset
- ds_free_packs(ctx->d_audio);
- audio_delay -= ctx->sh_audio->stream_delay;
- ctx->delay = -audio_delay;
- ao_reset(ctx->ao);
- resync_audio_stream(ctx->sh_audio);
- }
-
- audio_delay = 0.0f;
- ctx->sub_counts[SUB_SOURCE_DEMUX] = mp_dvdnav_number_of_subs(ctx->stream);
- if (opts->sub_lang && opts->sub_id == dvdsub_lang_id) {
- dvdsub_lang_id = mp_dvdnav_sid_from_lang(ctx->stream, opts->sub_lang);
- if (dvdsub_lang_id != opts->sub_id) {
- opts->sub_id = dvdsub_lang_id;
- select_subtitle(ctx);
- }
- }
-
- /// clear all EOF related flags
- ctx->d_video->eof = ctx->d_audio->eof = ctx->stream->eof = 0;
-}
-
-/// Restore last decoded DVDNAV (still frame)
-static mp_image_t *mp_dvdnav_restore_smpi(struct MPContext *mpctx,
- int *in_size,
- unsigned char **start,
- mp_image_t *decoded_frame)
-{
- if (mpctx->stream->type != STREAMTYPE_DVDNAV)
- return decoded_frame;
-
- /// a change occurred in dvdnav stream
- if (mp_dvdnav_cell_has_changed(mpctx->stream, 0)) {
- mp_dvdnav_read_wait(mpctx->stream, 1, 1);
- mp_dvdnav_context_free(mpctx);
- mp_dvdnav_reset_stream(mpctx);
- mp_dvdnav_read_wait(mpctx->stream, 0, 1);
- mp_dvdnav_cell_has_changed(mpctx->stream, 1);
- }
-
- if (*in_size < 0) {
- float len;
-
- /// Display still frame, if any
- if (mpctx->nav_smpi && !mpctx->nav_buffer)
- decoded_frame = mpctx->nav_smpi;
-
- /// increment video frame : continue playing after still frame
- len = get_time_length(mpctx);
- if (mpctx->sh_video->pts >= len &&
- mpctx->sh_video->pts > 0.0 && len > 0.0) {
- mp_dvdnav_skip_still(mpctx->stream);
- mp_dvdnav_skip_wait(mpctx->stream);
- }
- mpctx->sh_video->pts += 1 / mpctx->sh_video->fps;
-
- if (mpctx->nav_buffer) {
- *start = mpctx->nav_start;
- *in_size = mpctx->nav_in_size;
- if (mpctx->nav_start)
- memcpy(*start, mpctx->nav_buffer, mpctx->nav_in_size);
- }
- }
-
- return decoded_frame;
-}
-
-/// Save last decoded DVDNAV (still frame)
-static void mp_dvdnav_save_smpi(struct MPContext *mpctx, int in_size,
- unsigned char *start,
- mp_image_t *decoded_frame)
-{
- if (mpctx->stream->type != STREAMTYPE_DVDNAV)
- return;
-
- free(mpctx->nav_buffer);
- mpctx->nav_buffer = NULL;
- mpctx->nav_start = NULL;
- mpctx->nav_in_size = -1;
-
- if (in_size > 0)
- mpctx->nav_buffer = malloc(in_size);
- if (mpctx->nav_buffer) {
- mpctx->nav_start = start;
- mpctx->nav_in_size = in_size;
- memcpy(mpctx->nav_buffer, start, in_size);
- }
-
- if (decoded_frame && mpctx->nav_smpi != decoded_frame)
- mpctx->nav_smpi = mp_dvdnav_copy_mpi(mpctx->nav_smpi, decoded_frame);
-}
-#endif /* CONFIG_DVDNAV */
-
/* Modify video timing to match the audio timeline. There are two main
* reasons this is needed. First, video and audio can start from different
* positions at beginning of file or after a seek (MPlayer starts both
@@ -2365,20 +2198,8 @@ static double update_video_nocorrect_pts(struct MPContext *mpctx)
while (!in_size)
in_size = video_read_frame(sh_video, &sh_video->next_frame_time,
&packet, force_fps);
- if (in_size < 0) {
-#ifdef CONFIG_DVDNAV
- if (mpctx->stream->type == STREAMTYPE_DVDNAV) {
- if (mp_dvdnav_is_eof(mpctx->stream))
- return -1;
- if (mpctx->d_video)
- mpctx->d_video->eof = 0;
- if (mpctx->d_audio)
- mpctx->d_audio->eof = 0;
- mpctx->stream->eof = 0;
- } else
-#endif
+ if (in_size < 0)
return -1;
- }
if (in_size > max_framesize)
max_framesize = in_size;
sh_video->timer += frame_time;
@@ -2389,16 +2210,8 @@ static double update_video_nocorrect_pts(struct MPContext *mpctx)
int framedrop_type = check_framedrop(mpctx, frame_time);
void *decoded_frame;
-#ifdef CONFIG_DVDNAV
- decoded_frame = mp_dvdnav_restore_smpi(mpctx, &in_size, &packet, NULL);
- if (in_size >= 0 && !decoded_frame)
-#endif
decoded_frame = decode_video(sh_video, sh_video->ds->current, packet,
in_size, framedrop_type, sh_video->pts);
-#ifdef CONFIG_DVDNAV
- // Save last still frame for future display
- mp_dvdnav_save_smpi(mpctx, in_size, packet, decoded_frame);
-#endif
if (decoded_frame) {
filter_video(sh_video, decoded_frame, sh_video->pts);
}
@@ -3195,30 +3008,6 @@ static void run_playloop(struct MPContext *mpctx)
break;
} // video
-#ifdef CONFIG_DVDNAV
- if (mpctx->stream->type == STREAMTYPE_DVDNAV) {
- nav_highlight_t hl;
- mp_dvdnav_get_highlight(mpctx->stream, &hl);
- if (!vo_spudec || !spudec_apply_palette_crop(vo_spudec, hl.palette, hl.sx, hl.sy, hl.ex, hl.ey)) {
- osd_set_nav_box(hl.sx, hl.sy, hl.ex, hl.ey);
- vo_osd_changed(OSDTYPE_DVDNAV);
- } else {
- osd_set_nav_box(0, 0, 0, 0);
- vo_osd_changed(OSDTYPE_DVDNAV);
- vo_osd_changed(OSDTYPE_SPU);
- }
-
- if (mp_dvdnav_stream_has_changed(mpctx->stream)) {
- double ar = -1.0;
- if (mpctx->sh_video &&
- stream_control(mpctx->demuxer->stream,
- STREAM_CTRL_GET_ASPECT_RATIO, &ar)
- != STREAM_UNSUPPORTED)
- mpctx->sh_video->stream_aspect = ar;
- }
- }
-#endif
-
if (mpctx->sh_audio && (mpctx->restart_playback ? !video_left :
mpctx->ao->untimed && (mpctx->delay <= 0 ||
!video_left))) {
@@ -3635,21 +3424,6 @@ static void play_current_file(struct MPContext *mpctx)
}
#endif
-#ifdef CONFIG_DVDNAV
- if (mpctx->stream->type == STREAMTYPE_DVDNAV) {
- if (opts->audio_lang && opts->audio_id == -1)
- opts->audio_id = mp_dvdnav_aid_from_lang(mpctx->stream,
- opts->audio_lang);
- dvdsub_lang_id = -3;
- if (opts->sub_lang && opts->sub_id == -1)
- dvdsub_lang_id = opts->sub_id = mp_dvdnav_sid_from_lang(
- mpctx->stream, opts->sub_lang);
- // setup global sub numbering
- mpctx->sub_counts[SUB_SOURCE_DEMUX] = mp_dvdnav_number_of_subs(
- mpctx->stream);
- }
-#endif
-
// CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts)
goto_enable_cache:
if (stream_cache_size > 0) {
@@ -3763,8 +3537,7 @@ goto_enable_cache:
demux_info_print(mpctx->demuxer);
//================= Read SUBTITLES (DVD & TEXT) =========================
- if (vo_spudec == NULL && (mpctx->stream->type == STREAMTYPE_DVD
- || mpctx->stream->type == STREAMTYPE_DVDNAV))
+ if (vo_spudec == NULL && (mpctx->stream->type == STREAMTYPE_DVD))
init_vo_spudec(mpctx);
open_subtitles_from_options(mpctx);
@@ -3844,8 +3617,6 @@ goto_enable_cache:
//TODO: add desired (stream-based) sections here
if (mpctx->stream->type == STREAMTYPE_TV)
mp_input_set_section(mpctx->input, "tv");
- if (mpctx->stream->type == STREAMTYPE_DVDNAV)
- mp_input_set_section(mpctx->input, "dvdnav");
//==================== START PLAYING =======================
@@ -3896,14 +3667,6 @@ goto_enable_cache:
end_at.type = END_AT_NONE;
}
-#ifdef CONFIG_DVDNAV
- mp_dvdnav_context_free(mpctx);
- if (mpctx->stream->type == STREAMTYPE_DVDNAV) {
- mp_dvdnav_read_wait(mpctx->stream, 0, 1);
- mp_dvdnav_cell_has_changed(mpctx->stream, 1);
- }
-#endif
-
mpctx->seek = (struct seek_params){ 0 };
get_relative_time(mpctx); // reset current delta
// Make sure VO knows current pause state