diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-08-18 02:29:37 +0300 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-08-18 02:29:37 +0300 |
commit | 95da34aa071d64b21ef3e952b987ba3dcee84ca0 (patch) | |
tree | eabf4399e40fd270714c53d40688eadadfd4c5ff /libmpdemux | |
parent | f394231f5de9d1ff679f1b2da4d1f1b303ae914a (diff) | |
parent | 3961e12fca2f1ec10c64e3ff298828feecca52c9 (diff) | |
download | mpv-95da34aa071d64b21ef3e952b987ba3dcee84ca0.tar.bz2 mpv-95da34aa071d64b21ef3e952b987ba3dcee84ca0.tar.xz |
Merge svn changes up to r29532
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_lavf.c | 19 | ||||
-rw-r--r-- | libmpdemux/demux_mf.c | 7 | ||||
-rw-r--r-- | libmpdemux/demux_mkv.c | 5 | ||||
-rw-r--r-- | libmpdemux/demux_pva.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_rawaudio.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_rtp.cpp | 8 | ||||
-rw-r--r-- | libmpdemux/demux_rtp_codec.cpp | 8 | ||||
-rw-r--r-- | libmpdemux/demux_ts.c | 7 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 5 | ||||
-rw-r--r-- | libmpdemux/matroska.h | 1 | ||||
-rw-r--r-- | libmpdemux/mp_taglists.c | 1 | ||||
-rw-r--r-- | libmpdemux/mpeg_hdr.c | 17 |
12 files changed, 59 insertions, 23 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 1c25edf160..344a71d615 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -422,6 +422,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ AVFormatContext *avfc; AVFormatParameters ap; const AVOption *opt; + AVMetadataTag *t = NULL; lavf_priv_t *priv= demuxer->priv; int i; char mp_filename[256]="mp:"; @@ -477,20 +478,17 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ return NULL; } - if(avfc->title [0]) demux_info_add(demuxer, "title" , avfc->title ); - if(avfc->author [0]) demux_info_add(demuxer, "author" , avfc->author ); - if(avfc->copyright[0]) demux_info_add(demuxer, "copyright", avfc->copyright); - if(avfc->comment [0]) demux_info_add(demuxer, "comments" , avfc->comment ); - if(avfc->album [0]) demux_info_add(demuxer, "album" , avfc->album ); -// if(avfc->year ) demux_info_add(demuxer, "year" , avfc->year ); -// if(avfc->track ) demux_info_add(demuxer, "track" , avfc->track ); - if(avfc->genre [0]) demux_info_add(demuxer, "genre" , avfc->genre ); + /* Add metadata. */ + av_metadata_conv(avfc, NULL, avfc->iformat->metadata_conv); + while((t = av_metadata_get(avfc->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) + demux_info_add(demuxer, t->key, t->value); for(i=0; i < avfc->nb_chapters; i++) { AVChapter *c = avfc->chapters[i]; uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000}); uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000}); - demuxer_add_chapter(demuxer, c->title, start, end); + t = av_metadata_get(c->metadata, "title", NULL, 0); + demuxer_add_chapter(demuxer, t ? t->value : NULL, start, end); } if(avfc->nb_programs) { @@ -512,7 +510,8 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ p = start; do { AVProgram *program = avfc->programs[p]; - mp_msg(MSGT_HEADER,MSGL_INFO,"LAVF: Program %d %s\n", program->id, (program->name ? program->name : "")); + 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)) diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c index c7ac81d56f..9320c544ff 100644 --- a/libmpdemux/demux_mf.c +++ b/libmpdemux/demux_mf.c @@ -41,7 +41,7 @@ static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_del else newpos+=rel_seek_secs * sh_video->fps; if ( newpos < 0 ) newpos=0; if( newpos >= mf->nr_of_files) newpos=mf->nr_of_files - 1; - mf->curr_frame=newpos; + demuxer->filepos=mf->curr_frame=newpos; } // return value: @@ -71,7 +71,7 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){ } fclose( f ); - mf->curr_frame++; + demuxer->filepos=mf->curr_frame++; return 1; } @@ -82,6 +82,7 @@ static const struct { uint32_t format; } type2format[] = { { "bmp", mmioFOURCC('b', 'm', 'p', ' ') }, + { "dpx", mmioFOURCC('d', 'p', 'x', ' ') }, { "jpeg", mmioFOURCC('I', 'J', 'P', 'G') }, { "jpg", mmioFOURCC('I', 'J', 'P', 'G') }, { "jls", mmioFOURCC('I', 'J', 'P', 'G') }, @@ -125,7 +126,7 @@ static demuxer_t* demux_open_mf(demuxer_t* demuxer){ mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] file type was not set! trying 'type=%s'...\n", mf_type); } - mf->curr_frame=0; + demuxer->filepos=mf->curr_frame=0; demuxer->movi_start = 0; demuxer->movi_end = mf->nr_of_files - 1; diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 9c984a11a9..27e564578e 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -1798,6 +1798,8 @@ demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid) track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2'); else if (!strcmp(track->codec_id, MKV_A_WAVPACK)) track->a_formattag = mmioFOURCC('W', 'V', 'P', 'K'); + else if (!strcmp(track->codec_id, MKV_A_TRUEHD)) + track->a_formattag = mmioFOURCC('T', 'R', 'H', 'D'); else if (!strcmp(track->codec_id, MKV_A_FLAC)) { if (track->private_data == NULL || track->private_size == 0) @@ -2037,7 +2039,8 @@ demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid) dp->flags = 0; ds_add_packet (demuxer->audio, dp); } - else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K')) + else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') || + track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) { /* do nothing, still works */ } else if (!track->ms_compat || (track->private_size < sizeof(WAVEFORMATEX))) { diff --git a/libmpdemux/demux_pva.c b/libmpdemux/demux_pva.c index ee9b4158bd..39fad12184 100644 --- a/libmpdemux/demux_pva.c +++ b/libmpdemux/demux_pva.c @@ -439,7 +439,7 @@ int pva_get_payload(demuxer_t * d,pva_payload_t * payload) buffer[255]=stream_read_char(d->stream); pes_head_len=stream_read_char(d->stream); stream_read(d->stream,buffer,pes_head_len); - if(!buffer[255]&0x80) //PES header does not contain PTS. + if(!(buffer[255]&0x80)) //PES header does not contain PTS. { mp_msg(MSGT_DEMUX,MSGL_V,"Audio PES packet does not contain PTS. (pes_head_len=%d)\n",pes_head_len); payload->pts=priv->last_audio_pts; diff --git a/libmpdemux/demux_rawaudio.c b/libmpdemux/demux_rawaudio.c index 769f9be519..0f78e0a6df 100644 --- a/libmpdemux/demux_rawaudio.c +++ b/libmpdemux/demux_rawaudio.c @@ -112,7 +112,6 @@ static void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,float aud // printf("demux_rawaudio: streamtell=%d\n",(int)stream_tell(demuxer->stream)); } - const demuxer_desc_t demuxer_desc_rawaudio = { "Raw audio demuxer", "rawaudio", @@ -126,5 +125,4 @@ const demuxer_desc_t demuxer_desc_rawaudio = { demux_rawaudio_open, NULL, demux_rawaudio_seek, - NULL }; diff --git a/libmpdemux/demux_rtp.cpp b/libmpdemux/demux_rtp.cpp index afe550b284..652be80a2b 100644 --- a/libmpdemux/demux_rtp.cpp +++ b/libmpdemux/demux_rtp.cpp @@ -118,6 +118,9 @@ int rtsp_transport_tcp = 0; #endif extern int rtsp_port; +#ifdef CONFIG_LIBAVCODEC +extern AVCodecContext *avcctx; +#endif extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) { struct MPOpts *opts = demuxer->opts; @@ -390,6 +393,9 @@ extern "C" void demux_close_rtp(demuxer_t* demuxer) { delete rtpState->videoBufferQueue; delete rtpState->sdpDescription; delete rtpState; +#ifdef CONFIG_LIBAVCODEC + av_freep(&avcctx); +#endif env->reclaim(); delete scheduler; } @@ -563,7 +569,7 @@ static demux_packet_t* getBuffer(demuxer_t* demuxer, demux_stream_t* ds, } if (headersize == 3 && h264parserctx) { // h264 consumed = h264parserctx->parser->parser_parse(h264parserctx, - NULL, + avcctx, &poutbuf, &poutbuf_size, dp->buffer, dp->len); diff --git a/libmpdemux/demux_rtp_codec.cpp b/libmpdemux/demux_rtp_codec.cpp index 839da403ca..32bfc43647 100644 --- a/libmpdemux/demux_rtp_codec.cpp +++ b/libmpdemux/demux_rtp_codec.cpp @@ -29,6 +29,7 @@ extern "C" { #ifdef CONFIG_LIBAVCODEC AVCodecParserContext * h264parserctx; +AVCodecContext *avcctx; #endif // Copied from vlc @@ -137,6 +138,7 @@ void rtpCodecInitialize_video(demuxer_t* demuxer, #ifdef CONFIG_LIBAVCODEC avcodec_register_all(); h264parserctx = av_parser_init(CODEC_ID_H264); + avcctx = avcodec_alloc_context(); #endif needVideoFrameRate(demuxer, subsession); } else if (strcmp(subsession->codecName(), "H261") == 0) { @@ -181,6 +183,8 @@ void rtpCodecInitialize_video(demuxer_t* demuxer, bih->biCompression = sh_video->format = fourcc; bih->biWidth = qtRTPSource->qtState.width; bih->biHeight = qtRTPSource->qtState.height; + if (qtRTPSource->qtState.sdAtomSize > 83) + bih->biBitCount = qtRTPSource->qtState.sdAtom[83]; uint8_t *pos = (uint8_t*)qtRTPSource->qtState.sdAtom + 86; uint8_t *endpos = (uint8_t*)qtRTPSource->qtState.sdAtom + qtRTPSource->qtState.sdAtomSize; @@ -315,6 +319,10 @@ void rtpCodecInitialize_audio(demuxer_t* demuxer, wf->wFormatTag = sh_audio->format = fourcc; wf->nChannels = numChannels; + if (qtRTPSource->qtState.sdAtomSize > 33) { + wf->wBitsPerSample = qtRTPSource->qtState.sdAtom[27]; + wf->nSamplesPerSec = qtRTPSource->qtState.sdAtom[32]<<8|qtRTPSource->qtState.sdAtom[33]; + } uint8_t *pos = (uint8_t*)qtRTPSource->qtState.sdAtom + 52; uint8_t *endpos = (uint8_t*)qtRTPSource->qtState.sdAtom + qtRTPSource->qtState.sdAtomSize; diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c index c213c34a35..938793bdc4 100644 --- a/libmpdemux/demux_ts.c +++ b/libmpdemux/demux_ts.c @@ -77,6 +77,7 @@ typedef enum AUDIO_DTS = 0x2001, AUDIO_LPCM_BE = 0x10001, AUDIO_AAC = mmioFOURCC('M', 'P', '4', 'A'), + AUDIO_TRUEHD = mmioFOURCC('T', 'R', 'H', 'D'), SPU_DVD = 0x3000000, SPU_DVB = 0x3000001, PES_PRIVATE1 = 0xBD00000, @@ -244,7 +245,7 @@ typedef struct { } TS_pids_t; -#define IS_AUDIO(x) (((x) == AUDIO_MP2) || ((x) == AUDIO_A52) || ((x) == AUDIO_LPCM_BE) || ((x) == AUDIO_AAC) || ((x) == AUDIO_DTS)) +#define IS_AUDIO(x) (((x) == AUDIO_MP2) || ((x) == AUDIO_A52) || ((x) == AUDIO_LPCM_BE) || ((x) == AUDIO_AAC) || ((x) == AUDIO_DTS) || ((x) == AUDIO_TRUEHD)) #define IS_VIDEO(x) (((x) == VIDEO_MPEG1) || ((x) == VIDEO_MPEG2) || ((x) == VIDEO_MPEG4) || ((x) == VIDEO_H264) || ((x) == VIDEO_AVC) || ((x) == VIDEO_VC1)) static int ts_parse(demuxer_t *demuxer, ES_stream_t *es, unsigned char *packet, int probe); @@ -871,6 +872,8 @@ static off_t ts_detect_streams(demuxer_t *demuxer, tsdemux_init_t *param) mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO LPCM(pid=%d)", param->apid); else if(param->atype == AUDIO_AAC) mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO AAC(pid=%d)", param->apid); + else if(param->atype == AUDIO_TRUEHD) + mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO TRUEHD(pid=%d)", param->apid); else { audio_found = 0; @@ -1412,6 +1415,8 @@ 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) + es->type = type_from_pmt = AUDIO_TRUEHD; } p += header_len + 9; diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 349131f12b..f4e5351290 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -240,7 +240,7 @@ demuxer_t *new_demuxer(struct MPOpts *opts, stream_t *stream, int type, d->movi_end = stream->end_pos; d->seekable = 1; d->synced = 0; - d->filepos = 0; + d->filepos = -1; d->audio = new_demuxer_stream(d, a_id); d->video = new_demuxer_stream(d, v_id); d->sub = new_demuxer_stream(d, s_id); @@ -1276,8 +1276,9 @@ int demuxer_get_percent_pos(demuxer_t *demuxer) int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans); int len = (demuxer->movi_end - demuxer->movi_start) / 100; if (res <= 0) { + off_t pos = demuxer->filepos > 0 ? demuxer->filepos : stream_tell(demuxer->stream); if (len > 0) - ans = (demuxer->filepos - demuxer->movi_start) / len; + ans = (pos - demuxer->movi_start) / len; else ans = 0; } diff --git a/libmpdemux/matroska.h b/libmpdemux/matroska.h index 3e4a404f38..3e569453c2 100644 --- a/libmpdemux/matroska.h +++ b/libmpdemux/matroska.h @@ -50,6 +50,7 @@ #define MKV_A_QDMC2 "A_QUICKTIME/QDM2" #define MKV_A_FLAC "A_FLAC" #define MKV_A_WAVPACK "A_WAVPACK4" +#define MKV_A_TRUEHD "A_TRUEHD" #define MKV_V_MSCOMP "V_MS/VFW/FOURCC" #define MKV_V_REALV10 "V_REAL/RV10" diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c index e1b6e90454..7874721987 100644 --- a/libmpdemux/mp_taglists.c +++ b/libmpdemux/mp_taglists.c @@ -48,6 +48,7 @@ static const struct mp_AVCodecTag mp_wav_tags[] = { { 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_WAVPACK, MKTAG('W', 'V', 'P', 'K')}, { CODEC_ID_WESTWOOD_SND1, MKTAG('S', 'N', 'D', '1')}, diff --git a/libmpdemux/mpeg_hdr.c b/libmpdemux/mpeg_hdr.c index bb1e416875..c07cd6bf16 100644 --- a/libmpdemux/mpeg_hdr.c +++ b/libmpdemux/mpeg_hdr.c @@ -303,6 +303,11 @@ static unsigned int read_golomb(unsigned char *buffer, unsigned int *init) return v2; } +inline static int read_golomb_s(unsigned char *buffer, unsigned int *init) +{ + unsigned int v = read_golomb(buffer, init); + return (v & 1) ? ((v + 1) >> 1) : -(v >> 1); +} static int h264_parse_vui(mp_mpeg_header_t * picture, unsigned char * buf, unsigned int n) { @@ -361,7 +366,7 @@ static int mp_unescape03(unsigned char *buf, int len); int h264_parse_sps(mp_mpeg_header_t * picture, unsigned char * buf, int len) { - unsigned int n = 0, v, i, mbh; + unsigned int n = 0, v, i, k, mbh; int frame_mbs_only; len = mp_unescape03(buf, len); @@ -376,7 +381,15 @@ int h264_parse_sps(mp_mpeg_header_t * picture, unsigned char * buf, int len) read_golomb(buf, &n); n++; if(getbits(buf, n++, 1)){ - //FIXME scaling matrix + for(i = 0; i < 8; i++) + { // scaling list is skipped for now + if(getbits(buf, n++, 1)) + { + v = 8; + for(k = (i < 6 ? 16 : 64); k && v; k--) + v = (v + read_golomb_s(buf, &n)) & 255; + } + } } } read_golomb(buf, &n); |