diff options
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_audio.c | 3 | ||||
-rw-r--r-- | libmpdemux/demux_demuxers.c | 13 | ||||
-rw-r--r-- | libmpdemux/demux_lavf.c | 39 | ||||
-rw-r--r-- | libmpdemux/demux_mkv.c | 12 | ||||
-rw-r--r-- | libmpdemux/demux_mov.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_rtp.cpp | 4 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 19 | ||||
-rw-r--r-- | libmpdemux/extension.c | 2 | ||||
-rw-r--r-- | libmpdemux/mp_taglists.c | 25 | ||||
-rw-r--r-- | libmpdemux/mp_taglists.h | 6 |
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 */ |