From 573a57de1cd5d4f705d990677d6167eb17eca687 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 24 Jan 2010 15:19:14 +0000 Subject: Reset the parser on seek. Should fix some cases of audio "blips" after seeking. AC3 is still broken due to the libavcodec parser being broken. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30421 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demuxer.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'libmpdemux/demuxer.c') diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 45bc418e31..042fefed82 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -60,6 +60,7 @@ // just be removed again. #define PARSE_ON_ADD 0 +static void clear_parser(sh_common_t *sh); void resync_video_stream(sh_video_t *sh_video); void resync_audio_stream(sh_audio_t *sh_audio); @@ -286,8 +287,7 @@ void free_sh_sub(sh_sub_t *sh) #endif free(sh->lang); #ifdef CONFIG_LIBAVCODEC - av_parser_close(sh->parser); - av_freep(&sh->avctx); + clear_parser((sh_common_t *)sh); #endif free(sh); } @@ -327,8 +327,7 @@ void free_sh_audio(demuxer_t *demuxer, int id) free(sh->codecdata); free(sh->lang); #ifdef CONFIG_LIBAVCODEC - av_parser_close(sh->parser); - av_freep(&sh->avctx); + clear_parser((sh_common_t *)sh); #endif free(sh); } @@ -359,8 +358,7 @@ void free_sh_video(sh_video_t *sh) mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_video at %p\n", sh); free(sh->bih); #ifdef CONFIG_LIBAVCODEC - av_parser_close(sh->parser); - av_freep(&sh->avctx); + clear_parser((sh_common_t *)sh); #endif free(sh); } @@ -510,6 +508,20 @@ int ds_parse(demux_stream_t *ds, uint8_t **buffer, int *len, double pts, off_t p return *len; return av_parser_parse2(parser, avctx, buffer, len, *buffer, *len, pts, pts, pos); } + +static void clear_parser(sh_common_t *sh) +{ + av_parser_close(sh->parser); + sh->parser = NULL; + av_freep(&sh->avctx); +} + +void ds_clear_parser(demux_stream_t *ds) +{ + if (!ds->sh) + return; + clear_parser(ds->sh); +} #endif void ds_add_packet(demux_stream_t *ds, demux_packet_t *dp) @@ -1200,6 +1212,11 @@ static void demux_resync(demuxer_t *demuxer) void demux_flush(demuxer_t *demuxer) { +#if PARSE_ON_ADD + ds_clear_parser(demuxer->video); + ds_clear_parser(demuxer->audio); + ds_clear_parser(demuxer->sub); +#endif ds_free_packs(demuxer->video); ds_free_packs(demuxer->audio); ds_free_packs(demuxer->sub); -- cgit v1.2.3 From 644f2b33ec712f6bf48b082d6a20628124167229 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 24 Jan 2010 16:38:46 +0000 Subject: Remove now unused variables. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30423 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demuxer.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'libmpdemux/demuxer.c') diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 042fefed82..36e94eb747 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -1225,8 +1225,6 @@ void demux_flush(demuxer_t *demuxer) int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { - demux_stream_t *d_audio = demuxer->audio; - demux_stream_t *d_video = demuxer->video; double tmp = 0; double pts; -- cgit v1.2.3 From b8b5fe55706afa272fde0cea8ab880390700624b Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 24 Jan 2010 20:05:28 +0000 Subject: Add support for parsing MLP and TrueHD. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30427 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demuxer.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libmpdemux/demuxer.c') diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 36e94eb747..15960c9ae3 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -458,6 +458,9 @@ static void allocate_parser(AVCodecContext **avctx, AVCodecParserContext **parse case 0x86: codec_id = CODEC_ID_DTS; break; + case MKTAG('M', 'L', 'P', ' '): + codec_id = CODEC_ID_MLP; + break; case 0x55: case 0x5500736d: case MKTAG('.', 'm', 'p', '3'): @@ -470,6 +473,9 @@ static void allocate_parser(AVCodecContext **avctx, AVCodecParserContext **parse case MKTAG('.', 'm', 'p', '1'): codec_id = CODEC_ID_MP2; break; + case MKTAG('T', 'R', 'H', 'D'): + codec_id = CODEC_ID_TRUEHD; + break; } if (codec_id != CODEC_ID_NONE) { *avctx = avcodec_alloc_context(); -- cgit v1.2.3