summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c19
-rw-r--r--libmpdemux/demux_mf.c7
-rw-r--r--libmpdemux/demux_mkv.c5
-rw-r--r--libmpdemux/demux_pva.c2
-rw-r--r--libmpdemux/demux_rawaudio.c2
-rw-r--r--libmpdemux/demux_rtp.cpp8
-rw-r--r--libmpdemux/demux_rtp_codec.cpp8
-rw-r--r--libmpdemux/demux_ts.c7
-rw-r--r--libmpdemux/demuxer.c5
-rw-r--r--libmpdemux/matroska.h1
-rw-r--r--libmpdemux/mp_taglists.c1
-rw-r--r--libmpdemux/mpeg_hdr.c17
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);