summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2010-01-28 00:37:32 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2010-01-28 00:37:32 +0200
commit6ece23f1b12e80960c66a8596a3c927bf7ee8621 (patch)
tree0163085cfa02840fe8b0e994657583120e8f574a /libmpdemux/demuxer.c
parent167322fa33b6efbc1f1d681327b4a928ba0b706a (diff)
parentb1f3c590c79534efb970220d4c186063adb225aa (diff)
downloadmpv-6ece23f1b12e80960c66a8596a3c927bf7ee8621.tar.bz2
mpv-6ece23f1b12e80960c66a8596a3c927bf7ee8621.tar.xz
Merge svn changes up to r30437
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r--libmpdemux/demuxer.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 78c18e7640..80d4b556b3 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -59,6 +59,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);
@@ -284,8 +285,7 @@ static 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);
}
@@ -326,8 +326,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);
}
@@ -460,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'):
@@ -472,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();
@@ -510,6 +514,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)
@@ -1201,6 +1219,11 @@ demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format,
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);