summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_audio.c3
-rw-r--r--libmpdemux/demux_demuxers.c13
-rw-r--r--libmpdemux/demux_lavf.c39
-rw-r--r--libmpdemux/demux_mkv.c12
-rw-r--r--libmpdemux/demux_mov.c2
-rw-r--r--libmpdemux/demux_rtp.cpp4
-rw-r--r--libmpdemux/demuxer.c19
-rw-r--r--libmpdemux/extension.c2
-rw-r--r--libmpdemux/mp_taglists.c25
-rw-r--r--libmpdemux/mp_taglists.h6
10 files changed, 74 insertions, 51 deletions
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
index aa950046c6..f20c7d52f1 100644
--- a/libmpdemux/demux_audio.c
+++ b/libmpdemux/demux_audio.c
@@ -528,11 +528,10 @@ static int demux_audio_open(demuxer_t* demuxer) {
}
-static int demux_audio_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) {
+static int demux_audio_fill_buffer(demuxer_t *demux, demux_stream_t *ds) {
int l;
demux_packet_t* dp;
sh_audio_t* sh_audio = ds->sh;
- demuxer_t* demux = ds->demuxer;
da_priv_t* priv = demux->priv;
double this_pts = priv->next_pts;
stream_t* s = demux->stream;
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..31eabc67a1 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -172,16 +172,18 @@ static int lavf_check_file(demuxer_t *demuxer){
static const char * const preferred_list[] = {
"dxa",
- "wv",
- "nuv",
- "nut",
- "gxf",
- "mxf",
"flv",
- "swf",
+ "gxf",
+ "nut",
+ "nuv",
"mov,mp4,m4a,3gp,3g2,mj2",
"mpc",
"mpc8",
+ "mxf",
+ "swf",
+ "vqf",
+ "w64",
+ "wv",
NULL
};
@@ -220,11 +222,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,15 +239,9 @@ 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;
- if(codec->codec_id == CODEC_ID_ADPCM_IMA_AMV)
- codec->codec_tag= MKTAG('A','M','V','A');
if(!codec->codec_tag)
codec->codec_tag= mp_av_codec_get_tag(mp_wav_taglists, codec->codec_id);
wf->wFormatTag= codec->codec_tag;
@@ -491,6 +490,8 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
demuxer_add_chapter(demuxer, t ? t->value : NULL, start, end);
}
+ for(i=0; i<avfc->nb_streams; i++)
+ handle_stream(demuxer, avfc, i);
if(avfc->nb_programs) {
int p, start=0, found=0;
@@ -512,15 +513,11 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
AVProgram *program = avfc->programs[p];
t = av_metadata_get(program->metadata, "title", NULL, 0);
mp_msg(MSGT_HEADER,MSGL_INFO,"LAVF: Program %d %s\n", program->id, t ? t->value : "");
- for(i=0; i<program->nb_stream_indexes; i++)
- handle_stream(demuxer, avfc, program->stream_index[i]);
if(!priv->cur_program && (demuxer->video->sh || demuxer->audio->sh))
priv->cur_program = program->id;
p = (p + 1) % avfc->nb_programs;
} while(p!=start);
- } else
- for(i=0; i<avfc->nb_streams; i++)
- handle_stream(demuxer, avfc, i);
+ }
mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams);
mp_msg(MSGT_HEADER,MSGL_V,"LAVF: build %d\n", LIBAVFORMAT_BUILD);
@@ -715,6 +712,7 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
demux_program_t *prog = arg;
AVProgram *program;
int p, i;
+ int start;
if(priv->avfc->nb_programs < 2)
return DEMUXER_CTRL_NOTIMPL;
@@ -736,6 +734,7 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
p = i;
}
prog->vid = prog->aid = prog->sid = -2; //no audio and no video by default
+ start = p;
redo:
program = priv->avfc->programs[p];
for(i=0; i<program->nb_stream_indexes; i++)
@@ -759,6 +758,8 @@ redo:
if(prog->progid == -1 && prog->vid == -2 && prog->aid == -2)
{
p = (p + 1) % priv->avfc->nb_programs;
+ if (p == start)
+ return DEMUXER_CTRL_DONTKNOW;
goto redo;
}
priv->cur_program = prog->progid = program->id;
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 27e564578e..118217e999 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1319,17 +1319,19 @@ demux_mkv_read_attachments (demuxer_t *demuxer)
switch (ebml_read_id (s, &il))
{
case MATROSKA_ID_FILENAME:
+ free(name);
name = ebml_read_utf8 (s, &l);
if (name == NULL)
- return 0;
+ goto error;
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + FileName: %s\n",
name);
break;
case MATROSKA_ID_FILEMIMETYPE:
+ free(mime);
mime = ebml_read_ascii (s, &l);
if (mime == NULL)
- return 0;
+ goto error;
mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + FileMimeType: %s\n",
mime);
break;
@@ -1343,7 +1345,10 @@ demux_mkv_read_attachments (demuxer_t *demuxer)
data = malloc (num);
if (stream_read(s, data, num) != (int) num)
{
+ error:
free(data);
+ free(mime);
+ free(name);
return 0;
}
data_size = num;
@@ -1360,6 +1365,9 @@ demux_mkv_read_attachments (demuxer_t *demuxer)
}
demuxer_add_attachment(demuxer, name, mime, data, data_size);
+ free(data);
+ free(mime);
+ free(name);
mp_msg(MSGT_DEMUX, MSGL_V,
"[mkv] Attachment: %s, %s, %u bytes\n",
name, mime, data_size);
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..d08d97468b 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;
}
@@ -1165,6 +1158,10 @@ int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param)
for (n = 0; info && info[2 * n] != NULL; n++) {
if (!strcasecmp(opt, info[2 * n])) {
+ if (!strcmp(param, info[2 * n + 1])) {
+ mp_msg(MSGT_DEMUX, MSGL_V, "Demuxer info %s set to unchanged value %s\n", opt, param);
+ return 0;
+ }
mp_tmsg(MSGT_DEMUX, MSGL_INFO, "Demuxer info %s changed to %s\n", opt,
param);
free(info[2 * n + 1]);
diff --git a/libmpdemux/extension.c b/libmpdemux/extension.c
index 539dd043b4..59d242e4dd 100644
--- a/libmpdemux/extension.c
+++ b/libmpdemux/extension.c
@@ -65,7 +65,7 @@ static struct {
{ "it", DEMUXER_TYPE_XMMS },
{ "mid", DEMUXER_TYPE_XMMS },
{ "midi", DEMUXER_TYPE_XMMS },
- { "vqf", DEMUXER_TYPE_XMMS },
+ { "vqf", DEMUXER_TYPE_LAVF },
{ "nsv", DEMUXER_TYPE_NSV },
{ "nsa", DEMUXER_TYPE_NSV },
{ "mpc", DEMUXER_TYPE_MPC },
diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c
index 7874721987..12281ae997 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,20 +43,31 @@ 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', ' ')},
{ CODEC_ID_TRUEHD, MKTAG('T', 'R', 'H', 'D')},
{ CODEC_ID_TTA, MKTAG('T', 'T', 'A', '1')},
+ { CODEC_ID_TWINVQ, MKTAG('T', 'W', 'I', '2')},
{ CODEC_ID_WAVPACK, MKTAG('W', 'V', 'P', 'K')},
{ CODEC_ID_WESTWOOD_SND1, MKTAG('S', 'N', 'D', '1')},
{ CODEC_ID_XAN_DPCM, MKTAG('A', 'x', 'a', 'n')},
{ 0, 0 },
};
-const struct mp_AVCodecTag *mp_wav_taglists[] = {mp_ff_codec_wav_tags, mp_wav_tags, 0};
+const struct mp_AVCodecTag * const 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_ADPCM_IMA_AMV, MKTAG('A', 'M', 'V', 'A')},
+ { 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 +76,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 * const 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 +95,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,8 +109,7 @@ 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 },
};
-const struct mp_AVCodecTag *mp_bmp_taglists[] = {mp_ff_codec_bmp_tags, mp_bmp_tags, 0};
+const struct mp_AVCodecTag * const mp_bmp_taglists[] = {mp_ff_codec_bmp_tags, mp_bmp_tags, 0};
diff --git a/libmpdemux/mp_taglists.h b/libmpdemux/mp_taglists.h
index daa9c2dbcc..381b77a8db 100644
--- a/libmpdemux/mp_taglists.h
+++ b/libmpdemux/mp_taglists.h
@@ -23,10 +23,10 @@
#include "ffmpeg_files/taglists.h"
-extern const struct mp_AVCodecTag *mp_wav_taglists[];
+extern const struct mp_AVCodecTag * const mp_wav_taglists[];
-extern const struct mp_AVCodecTag *mp_wav_override_taglists[];
+extern const struct mp_AVCodecTag * const mp_codecid_override_taglists[];
-extern const struct mp_AVCodecTag *mp_bmp_taglists[];
+extern const struct mp_AVCodecTag * const mp_bmp_taglists[];
#endif /* MPLAYER_MP_TAGLISTS_H */