summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/asfheader.c1
-rw-r--r--libmpdemux/demux_rawaudio.c1
-rw-r--r--libmpdemux/demux_ts.c20
-rw-r--r--libmpdemux/demuxer.c35
-rw-r--r--libmpdemux/demuxer.h1
-rw-r--r--libmpdemux/mf.c1
-rw-r--r--libmpdemux/mp_taglists.c1
7 files changed, 44 insertions, 16 deletions
diff --git a/libmpdemux/asfheader.c b/libmpdemux/asfheader.c
index 186a1a967d..95d5f18e7f 100644
--- a/libmpdemux/asfheader.c
+++ b/libmpdemux/asfheader.c
@@ -444,6 +444,7 @@ int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf){
audio_pos += 64; //16+16+4+4+4+16+4;
buffer = &hdr[audio_pos];
sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F);
+ sh_audio->needs_parsing = 1;
mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[%s] Audio stream found, -aid %d\n", "asfheader", streamh->stream_no & 0x7F);
++audio_streams;
if (!asf_init_audio_stream(demuxer, asf, sh_audio, streamh, &audio_pos, &buffer, hdr, hdr_len))
diff --git a/libmpdemux/demux_rawaudio.c b/libmpdemux/demux_rawaudio.c
index 0f78e0a6df..949b2d5d7f 100644
--- a/libmpdemux/demux_rawaudio.c
+++ b/libmpdemux/demux_rawaudio.c
@@ -72,6 +72,7 @@ static demuxer_t* demux_rawaudio_open(demuxer_t* demuxer) {
demuxer->audio->id = 0;
demuxer->audio->sh = sh_audio;
sh_audio->ds = demuxer->audio;
+ sh_audio->needs_parsing = 1;
return demuxer;
}
diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c
index af9e2109f4..6b56b55ffc 100644
--- a/libmpdemux/demux_ts.c
+++ b/libmpdemux/demux_ts.c
@@ -97,7 +97,7 @@ typedef struct {
unsigned char *start;
uint16_t payload_size;
es_stream_type_t type, subtype;
- float pts, last_pts;
+ double pts, last_pts;
int pid;
char lang[4];
int last_cc; // last cc code (-1 if first packet)
@@ -219,8 +219,8 @@ typedef struct {
typedef struct {
uint64_t size;
float duration;
- float first_pts;
- float last_pts;
+ double first_pts;
+ double last_pts;
} TS_stream_info;
typedef struct {
@@ -1255,7 +1255,7 @@ static int mp4_parse_sl_packet(pmt_t *pmt, uint8_t *buf, uint16_t packet_len, in
return -1;
}
- pes_es->pts = (float) v / (float) sl->ts_resolution;
+ pes_es->pts = (double) v / (double) sl->ts_resolution;
mp_msg(MSGT_DEMUXER,MSGL_DBG2, "CTS: %d bits, value: %"PRIu64"/%d = %.3f\n", sl->ts_len, v, sl->ts_resolution, pes_es->pts);
}
@@ -1398,10 +1398,10 @@ static int pes_parse2(unsigned char *buf, uint16_t packet_len, ES_stream_t *es,
pts |= p[12] << 7 ;
pts |= (p[13] & 0xFE) >> 1 ;
- es->pts = pts / 90000.0f;
+ es->pts = pts / 90000.0;
}
else
- es->pts = 0.0f;
+ es->pts = 0.0;
header_len = p[8];
@@ -1418,7 +1418,7 @@ static int pes_parse2(unsigned char *buf, uint16_t packet_len, ES_stream_t *es,
int ssid = parse_pes_extension_fields(p, pkt_len);
if((audio_substream_id!=-1) && (ssid != audio_substream_id))
return 0;
- if(ssid == 0x72)
+ if(ssid == 0x72 && type_from_pmt != AUDIO_DTS)
es->type = type_from_pmt = AUDIO_TRUEHD;
}
@@ -3094,7 +3094,7 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
}
else
{
- if(es->pts == 0.0f)
+ if(es->pts == 0.0)
es->pts = tss->pts = tss->last_pts;
else
tss->pts = tss->last_pts = es->pts;
@@ -3277,8 +3277,8 @@ static void demux_seek_ts(demuxer_t *demuxer, float rel_seek_secs, float audio_d
{
if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts)
{
- float a_pts=d_audio->pts;
- a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
+ double a_pts=d_audio->pts;
+ a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(double)sh_audio->i_bps;
if(d_video->pts > a_pts)
{
skip_audio_frame(sh_audio); // sync audio
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index a336940dfe..5ec705af32 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);
}
@@ -447,6 +445,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'):
@@ -459,6 +460,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();
@@ -497,6 +501,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)
@@ -1188,6 +1206,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);
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 375c0d0ccf..def50af23e 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -401,6 +401,7 @@ int ds_get_packet_pts(demux_stream_t *ds, unsigned char **start, double *pts);
int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start);
double ds_get_next_pts(demux_stream_t *ds);
int ds_parse(demux_stream_t *sh, uint8_t **buffer, int *len, double pts, off_t pos);
+void ds_clear_parser(demux_stream_t *sh);
// This is defined here because demux_stream_t ins't defined in stream.h
stream_t* new_ds_stream(demux_stream_t *ds);
diff --git a/libmpdemux/mf.c b/libmpdemux/mf.c
index ee4de16dcc..53c4296bfa 100644
--- a/libmpdemux/mf.c
+++ b/libmpdemux/mf.c
@@ -33,6 +33,7 @@
#else
#include "osdep/glob.h"
#endif
+#include "osdep/strsep.h"
#include "mp_msg.h"
#include "help_mp.h"
diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c
index d40c17c34c..4b7c8ed331 100644
--- a/libmpdemux/mp_taglists.c
+++ b/libmpdemux/mp_taglists.c
@@ -38,6 +38,7 @@ static const struct mp_AVCodecTag mp_wav_tags[] = {
{ CODEC_ID_EAC3, MKTAG('E', 'A', 'C', '3')},
{ CODEC_ID_INTERPLAY_DPCM, MKTAG('I', 'N', 'P', 'A')},
{ CODEC_ID_MLP, MKTAG('M', 'L', 'P', ' ')},
+ { CODEC_ID_MP1, 0x50},
{ CODEC_ID_MUSEPACK7, MKTAG('M', 'P', 'C', ' ')},
{ CODEC_ID_MUSEPACK8, MKTAG('M', 'P', 'C', '8')},
{ CODEC_ID_NELLYMOSER, MKTAG('N', 'E', 'L', 'L')},