summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-09-04 19:49:35 +0300
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-09-04 19:49:35 +0300
commit0e1b7765be878491565cf5e471f22b15e106164c (patch)
tree422e500c289335182a2a64934dcabf10b95e32dc /libmpdemux
parenta9618c1c6fe9424dfaeb1677348e0382d7252554 (diff)
parentdcfd043ea8d0c46929aad78596314d837c290d39 (diff)
downloadmpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.bz2
mpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.xz
Merge svn changes up to r29644
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_demuxers.c13
-rw-r--r--libmpdemux/demux_lavf.c11
-rw-r--r--libmpdemux/demux_mov.c2
-rw-r--r--libmpdemux/demux_rtp.cpp4
-rw-r--r--libmpdemux/demuxer.c15
-rw-r--r--libmpdemux/mp_taglists.c19
-rw-r--r--libmpdemux/mp_taglists.h2
7 files changed, 37 insertions, 29 deletions
diff --git a/libmpdemux/demux_demuxers.c b/libmpdemux/demux_demuxers.c
index 483dd02c30..3b4f958394 100644
--- a/libmpdemux/demux_demuxers.c
+++ b/libmpdemux/demux_demuxers.c
@@ -55,6 +55,9 @@ demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) {
ret->video = vd->video;
ret->audio = ad->audio;
ret->sub = sd->sub;
+ if (vd) vd->video->demuxer = ret;
+ if (ad) ad->audio->demuxer = ret;
+ if (sd) sd->sub->demuxer = ret;
// HACK?, necessary for subtitle (and audio and video when implemented) switching
memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams));
@@ -71,11 +74,15 @@ static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) {
priv=demux->priv;
- if(ds->demuxer == priv->vd)
+ // HACK: make sure the subtitles get properly interleaved if with -subfile
+ if (priv->sd && priv->sd->sub != ds &&
+ priv->sd != priv->vd && priv->sd != priv->ad)
+ ds_get_next_pts(priv->sd->sub);
+ if(priv->vd && priv->vd->video == ds)
return demux_fill_buffer(priv->vd,ds);
- else if(ds->demuxer == priv->ad)
+ else if(priv->ad && priv->ad->audio == ds)
return demux_fill_buffer(priv->ad,ds);
- else if(ds->demuxer == priv->sd)
+ else if(priv->sd && priv->sd->sub == ds)
return demux_fill_buffer(priv->sd,ds);
mp_tmsg(MSGT_DEMUX,MSGL_WARN,"fill_buffer error: bad demuxer: not vd, ad or sd.\n");
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 344a71d615..fb89accaf3 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -220,11 +220,14 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) {
AVStream *st= avfc->streams[i];
AVCodecContext *codec= st->codec;
AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
- int g;
+ int g, override_tag = mp_av_codec_get_tag(mp_codecid_override_taglists,
+ codec->codec_id);
+ // For some formats (like PCM) always trust CODEC_ID_* more than codec_tag
+ if (override_tag)
+ codec->codec_tag = override_tag;
switch(codec->codec_type){
case CODEC_TYPE_AUDIO:{
- int override_tag;
WAVEFORMATEX *wf;
sh_audio_t* sh_audio;
sh_audio=new_sh_audio(demuxer, i);
@@ -234,10 +237,6 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) {
priv->astreams[priv->audio_streams] = i;
priv->audio_streams++;
wf= calloc(sizeof(WAVEFORMATEX) + codec->extradata_size, 1);
- // For some formats (like PCM) always trust CODEC_ID_* more than codec_tag
- override_tag= mp_av_codec_get_tag(mp_wav_override_taglists, codec->codec_id);
- if (override_tag)
- codec->codec_tag= override_tag;
// mp4a tag is used for all mp4 files no matter what they actually contain
if(codec->codec_tag == MKTAG('m', 'p', '4', 'a'))
codec->codec_tag= 0;
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c
index 10da40c5bb..97eae374e9 100644
--- a/libmpdemux/demux_mov.c
+++ b/libmpdemux/demux_mov.c
@@ -1445,7 +1445,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
z_stream zstrm;
stream_t* backup;
- if (moov_sz > SIZE_MAX - 16) {
+ if (moov_sz > UINT_MAX - 16) {
mp_msg(MSGT_DEMUX, MSGL_ERR, "Invalid cmvd atom size %d\n", moov_sz);
break;
}
diff --git a/libmpdemux/demux_rtp.cpp b/libmpdemux/demux_rtp.cpp
index 652be80a2b..8a5cfb8460 100644
--- a/libmpdemux/demux_rtp.cpp
+++ b/libmpdemux/demux_rtp.cpp
@@ -391,7 +391,7 @@ extern "C" void demux_close_rtp(demuxer_t* demuxer) {
Medium::close(rtpState->sipClient);
delete rtpState->audioBufferQueue;
delete rtpState->videoBufferQueue;
- delete rtpState->sdpDescription;
+ delete[] rtpState->sdpDescription;
delete rtpState;
#ifdef CONFIG_LIBAVCODEC
av_freep(&avcctx);
@@ -633,7 +633,7 @@ ReadBufferQueue::ReadBufferQueue(MediaSubsession* subsession,
}
ReadBufferQueue::~ReadBufferQueue() {
- delete fTag;
+ free((void *)fTag);
// Free any pending buffers (that never got delivered):
demux_packet_t* dp = pendingDPHead;
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index f4e5351290..1c39b236e1 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -658,19 +658,12 @@ int ds_get_packet_pts(demux_stream_t *ds, unsigned char **start, double *pts)
{
int len;
*pts = MP_NOPTS_VALUE;
- if (ds->buffer_pos >= ds->buffer_size) {
- if (!ds_fill_buffer(ds)) {
- // EOF
- *start = NULL;
- return -1;
- }
- }
+ len = ds_get_packet(ds, start);
+ if (len < 0)
+ return len;
// Return pts unless this read starts from the middle of a packet
- if (!ds->buffer_pos)
+ if (len == ds->buffer_pos)
*pts = ds->current->pts;
- len = ds->buffer_size - ds->buffer_pos;
- *start = &ds->buffer[ds->buffer_pos];
- ds->buffer_pos += len;
return len;
}
diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c
index 7874721987..6ae9235191 100644
--- a/libmpdemux/mp_taglists.c
+++ b/libmpdemux/mp_taglists.c
@@ -26,8 +26,6 @@
#include "ffmpeg_files/taglists.c"
static const struct mp_AVCodecTag mp_wav_tags[] = {
- { CODEC_ID_RA_144, MKTAG('1', '4', '_', '4')},
- { CODEC_ID_RA_288, MKTAG('2', '8', '_', '8')},
{ CODEC_ID_ADPCM_4XM, MKTAG('4', 'X', 'M', 'A')},
{ CODEC_ID_ADPCM_EA, MKTAG('A', 'D', 'E', 'A')},
{ CODEC_ID_ADPCM_EA_MAXIS_XA, MKTAG('A', 'D', 'X', 'A')},
@@ -45,6 +43,8 @@ static const struct mp_AVCodecTag mp_wav_tags[] = {
{ CODEC_ID_NELLYMOSER, MKTAG('N', 'E', 'L', 'L')},
{ CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'p')},
{ CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2')},
+ { CODEC_ID_RA_144, MKTAG('1', '4', '_', '4')},
+ { CODEC_ID_RA_288, MKTAG('2', '8', '_', '8')},
{ CODEC_ID_ROQ_DPCM, MKTAG('R', 'o', 'Q', 'A')},
{ CODEC_ID_SHORTEN, MKTAG('s', 'h', 'r', 'n')},
{ CODEC_ID_SPEEX, MKTAG('s', 'p', 'x', ' ')},
@@ -58,7 +58,14 @@ static const struct mp_AVCodecTag mp_wav_tags[] = {
const struct mp_AVCodecTag *mp_wav_taglists[] = {mp_ff_codec_wav_tags, mp_wav_tags, 0};
-static const struct mp_AVCodecTag mp_wav_override_tags[] = {
+static const struct mp_AVCodecTag mp_codecid_override_tags[] = {
+ { CODEC_ID_AAC, MKTAG('M', 'P', '4', 'A')},
+ { CODEC_ID_AC3, 0x2000},
+ { CODEC_ID_DTS, 0x2001},
+ { CODEC_ID_EAC3, MKTAG('E', 'A', 'C', '3')},
+ { CODEC_ID_H264, MKTAG('H', '2', '6', '4')},
+ { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'V')},
+ { CODEC_ID_PCM_BLURAY, MKTAG('B', 'P', 'C', 'M')},
{ CODEC_ID_PCM_S8, MKTAG('t', 'w', 'o', 's')},
{ CODEC_ID_PCM_U8, 1},
{ CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's')},
@@ -67,10 +74,12 @@ static const struct mp_AVCodecTag mp_wav_override_tags[] = {
{ CODEC_ID_PCM_S24LE, 1},
{ CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2')},
{ CODEC_ID_PCM_S32LE, 1},
+ { CODEC_ID_MP2, 0x50},
+ { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'G', '2')},
{ 0, 0 },
};
-const struct mp_AVCodecTag *mp_wav_override_taglists[] = {mp_wav_override_tags, 0};
+const struct mp_AVCodecTag *mp_codecid_override_taglists[] = {mp_codecid_override_tags, 0};
static const struct mp_AVCodecTag mp_bmp_tags[] = {
{ CODEC_ID_AMV, MKTAG('A', 'M', 'V', 'V')},
@@ -84,6 +93,7 @@ static const struct mp_AVCodecTag mp_bmp_tags[] = {
{ CODEC_ID_INTERPLAY_VIDEO, MKTAG('I', 'N', 'P', 'V')},
{ CODEC_ID_MDEC, MKTAG('M', 'D', 'E', 'C')},
{ CODEC_ID_MOTIONPIXELS, MKTAG('M', 'V', 'I', '1')},
+ { CODEC_ID_NUV, MKTAG('N', 'U', 'V', '1')},
{ CODEC_ID_RL2, MKTAG('R', 'L', '2', 'V')},
{ CODEC_ID_ROQ, MKTAG('R', 'o', 'Q', 'V')},
{ CODEC_ID_RV10, MKTAG('R', 'V', '1', '0')},
@@ -97,7 +107,6 @@ static const struct mp_AVCodecTag mp_bmp_tags[] = {
{ CODEC_ID_VMDVIDEO, MKTAG('V', 'M', 'D', 'V')},
{ CODEC_ID_WS_VQA, MKTAG('V', 'Q', 'A', 'V')},
{ CODEC_ID_XAN_WC3, MKTAG('W', 'C', '3', 'V')},
- { CODEC_ID_NUV, MKTAG('N', 'U', 'V', '1')},
{ 0, 0 },
};
diff --git a/libmpdemux/mp_taglists.h b/libmpdemux/mp_taglists.h
index daa9c2dbcc..81c0b35d86 100644
--- a/libmpdemux/mp_taglists.h
+++ b/libmpdemux/mp_taglists.h
@@ -25,7 +25,7 @@
extern const struct mp_AVCodecTag *mp_wav_taglists[];
-extern const struct mp_AVCodecTag *mp_wav_override_taglists[];
+extern const struct mp_AVCodecTag *mp_codecid_override_taglists[];
extern const struct mp_AVCodecTag *mp_bmp_taglists[];