diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-09-04 19:49:35 +0300 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-09-04 19:49:35 +0300 |
commit | 0e1b7765be878491565cf5e471f22b15e106164c (patch) | |
tree | 422e500c289335182a2a64934dcabf10b95e32dc /libmpdemux | |
parent | a9618c1c6fe9424dfaeb1677348e0382d7252554 (diff) | |
parent | dcfd043ea8d0c46929aad78596314d837c290d39 (diff) | |
download | mpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.bz2 mpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.xz |
Merge svn changes up to r29644
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_demuxers.c | 13 | ||||
-rw-r--r-- | libmpdemux/demux_lavf.c | 11 | ||||
-rw-r--r-- | libmpdemux/demux_mov.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_rtp.cpp | 4 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 15 | ||||
-rw-r--r-- | libmpdemux/mp_taglists.c | 19 | ||||
-rw-r--r-- | libmpdemux/mp_taglists.h | 2 |
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[]; |