summaryrefslogtreecommitdiff
path: root/src/demuxers
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2010-06-14 22:22:18 +0100
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2010-06-14 22:22:18 +0100
commit683cd0f89680fdb989e5166cf57ef9d1787c9044 (patch)
tree560441af7ccfe453f1f2bd752df14cce7ec2f3ed /src/demuxers
parent71ea5354dab942e485ba93505990e010f551ad86 (diff)
parent3da8e08c83e25577c47b0117155b3c36198e0277 (diff)
downloadxine-lib-683cd0f89680fdb989e5166cf57ef9d1787c9044.tar.gz
xine-lib-683cd0f89680fdb989e5166cf57ef9d1787c9044.tar.bz2
Merge from 1.1.
--HG-- rename : include/xine.h.in => include/xine.h rename : po/libxine1.pot => po/libxine2.pot
Diffstat (limited to 'src/demuxers')
-rw-r--r--src/demuxers/demux_flac.c3
-rw-r--r--src/demuxers/demux_matroska.c26
-rw-r--r--src/demuxers/demux_ts.c44
-rw-r--r--src/demuxers/demux_tta.c44
-rw-r--r--src/demuxers/matroska.h1
5 files changed, 63 insertions, 55 deletions
diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c
index ffb49e74e..2135f8d60 100644
--- a/src/demuxers/demux_flac.c
+++ b/src/demuxers/demux_flac.c
@@ -351,6 +351,7 @@ static void demux_flac_send_headers(demux_plugin_t *this_gen) {
demux_flac_t *this = (demux_flac_t *) this_gen;
buf_element_t *buf;
xine_waveformatex wave;
+ int bits;
this->audio_fifo = this->stream->audio_fifo;
@@ -364,7 +365,7 @@ static void demux_flac_send_headers(demux_plugin_t *this_gen) {
}
/* lie about 24bps */
- int bits = this->bits_per_sample > 16 ? 16 : this->bits_per_sample;
+ bits = this->bits_per_sample > 16 ? 16 : this->bits_per_sample;
buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
buf->type = BUF_AUDIO_FLAC;
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c
index 032917ad9..9deaca161 100644
--- a/src/demuxers/demux_matroska.c
+++ b/src/demuxers/demux_matroska.c
@@ -810,6 +810,17 @@ static void init_codec_vobsub(demux_matroska_t *this,
}
}
+static void init_codec_spu(demux_matroska_t *this, matroska_track_t *track) {
+ buf_element_t *buf;
+
+ buf = track->fifo->buffer_pool_alloc (track->fifo);
+
+ buf->size = 0;
+ buf->type = track->buf_type;
+
+ track->fifo->put (track->fifo, buf);
+}
+
static void handle_realvideo (demux_plugin_t *this_gen, matroska_track_t *track,
int decoder_flags,
uint8_t *data, size_t data_len,
@@ -1433,6 +1444,10 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
if (track->compress_algo == MATROSKA_COMPRESS_NONE) {
track->compress_algo = MATROSKA_COMPRESS_UNKNOWN;
}
+ } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_S_HDMV_PGS)) {
+ lprintf("MATROSKA_CODEC_ID_S_HDMV_PGS\n");
+ track->buf_type = BUF_SPU_HDMV;
+ init_codec = init_codec_spu;
} else {
lprintf("unknown codec\n");
}
@@ -2956,7 +2971,8 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
goto error;
if (ebml->max_size_len > 8)
goto error;
- if (strcmp(ebml->doctype, "matroska"))
+ /* handle both Matroska and WebM here; we don't (presently) differentiate */
+ if (strcmp(ebml->doctype, "matroska") && strcmp(ebml->doctype, "webm"))
goto error;
this->event_queue = xine_event_new_queue(this->stream);
@@ -2986,11 +3002,13 @@ static void *init_class (xine_t *xine, void *data) {
this->xine = xine;
this->demux_class.open_plugin = open_plugin;
- this->demux_class.description = N_("matroska demux plugin");
+ this->demux_class.description = N_("matroska & webm demux plugin");
this->demux_class.identifier = "matroska";
this->demux_class.mimetypes = "video/mkv: mkv: matroska;"
- "video/x-matroska: mkv: matroska;";
- this->demux_class.extensions = "mkv";
+ "video/x-matroska: mkv: matroska;"
+ "video/webm: wbm,webm: WebM;";
+
+ this->demux_class.extensions = "mkv wbm webm";
this->demux_class.dispose = default_demux_class_dispose;
return this;
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index 39b273abf..b038e52ef 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -790,7 +790,13 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m,
* these "raw" streams may begin with a byte that looks like a stream type.
* For audio streams, m->type already contains the stream no.
*/
- if((m->descriptor_tag == STREAM_AUDIO_AC3) || /* ac3 - raw */
+ if(m->descriptor_tag == HDMV_AUDIO_84_EAC3) {
+ m->content = p;
+ m->size = packet_len;
+ m->type |= BUF_AUDIO_EAC3;
+ return 1;
+
+ } else if((m->descriptor_tag == STREAM_AUDIO_AC3) || /* ac3 - raw */
(p[0] == 0x0B && p[1] == 0x77)) { /* ac3 - syncword */
m->content = p;
m->size = packet_len;
@@ -1415,28 +1421,32 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
break;
case ISO_13818_PES_PRIVATE:
for (i = 5; i < coded_length; i += stream[i+1] + 2) {
- if ((stream[i] == 0x6a) && (this->audio_tracks_count < MAX_AUDIO_TRACKS)) {
- int i, found = 0;
- for(i = 0; i < this->audio_tracks_count; i++) {
+ if (((stream[i] == 0x6a) || (stream[i] == 0x7a)) && (this->audio_tracks_count < MAX_AUDIO_TRACKS)) {
+ int j, found = 0;
+ for(j = 0; j < this->audio_tracks_count; j++) {
if(this->audio_tracks[i].pid == pid) {
found = 1;
break;
- }
+ }
}
- if(!found) {
+ if (!found) {
#ifdef TS_PMT_LOG
printf ("demux_ts: PMT AC3 audio pid 0x%.4x type %2.2x\n", pid, stream[0]);
#endif
- demux_ts_pes_new(this, this->media_num, pid,
- this->audio_fifo, STREAM_AUDIO_AC3);
-
- this->audio_tracks[this->audio_tracks_count].pid = pid;
- this->audio_tracks[this->audio_tracks_count].media_index = this->media_num;
- this->media[this->media_num].type = this->audio_tracks_count;
- demux_ts_get_lang_desc(this, this->audio_tracks[this->audio_tracks_count].lang,
- stream + 5, stream_info_length);
- this->audio_tracks_count++;
- break;
+ if (stream[i] == 0x6a)
+ demux_ts_pes_new(this, this->media_num, pid,
+ this->audio_fifo, STREAM_AUDIO_AC3);
+ else
+ demux_ts_pes_new(this, this->media_num, pid,
+ this->audio_fifo, HDMV_AUDIO_84_EAC3);
+
+ this->audio_tracks[this->audio_tracks_count].pid = pid;
+ this->audio_tracks[this->audio_tracks_count].media_index = this->media_num;
+ this->media[this->media_num].type = this->audio_tracks_count;
+ demux_ts_get_lang_desc(this, this->audio_tracks[this->audio_tracks_count].lang,
+ stream + 5, stream_info_length);
+ this->audio_tracks_count++;
+ break;
}
}
/* Teletext */
@@ -1449,7 +1459,7 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
printf ("%.2x ", stream[i]);
printf ("\n");
#endif
- break;
+ break;
}
/* DVBSUB */
diff --git a/src/demuxers/demux_tta.c b/src/demuxers/demux_tta.c
index 3df30daef..1cd9d55de 100644
--- a/src/demuxers/demux_tta.c
+++ b/src/demuxers/demux_tta.c
@@ -121,39 +121,17 @@ static int demux_tta_send_chunk(demux_plugin_t *this_gen) {
bytes_to_read = le2me_32(this->seektable[this->currentframe]);
- while(bytes_to_read) {
- off_t bytes_read = 0;
- buf_element_t *buf = NULL;
-
- /* Get a buffer */
- buf = this->audio_fifo->buffer_pool_alloc(this->audio_fifo);
- buf->type = BUF_AUDIO_TTA;
- buf->pts = (int64_t)(FRAME_TIME * this->currentframe * 90000);
- buf->extra_info->total_time = (int)(le2me_32(this->header.tta.data_length) * 1000.0 / le2me_32(this->header.tta.samplerate)); /* milliseconds */
- buf->decoder_flags = 0;
-
- /* Set normalised position */
- buf->extra_info->input_normpos =
- (int) ((double) this->currentframe * 65535 / this->totalframes);
-
- /* Set time */
- buf->extra_info->input_time = (int)(FRAME_TIME * this->currentframe * 1000);
-
- bytes_read = this->input->read(this->input, buf->content, ( bytes_to_read > buf->max_size ) ? buf->max_size : bytes_to_read);
- if (bytes_read < 0) {
- this->status = DEMUX_FINISHED;
- break;
- }
-
- buf->size = bytes_read;
-
- bytes_to_read -= bytes_read;
-
- if ( bytes_to_read <= 0 )
- buf->decoder_flags |= BUF_FLAG_FRAME_END;
-
- this->audio_fifo->put(this->audio_fifo, buf);
- }
+ _x_demux_read_send_data(this->audio_fifo,
+ this->input,
+ bytes_to_read,
+ (int64_t)(FRAME_TIME * this->currentframe * 90000),
+ BUF_AUDIO_TTA,
+ /*decoder_flags*/ 0,
+ (int) ((double) this->currentframe * 65535.0 / this->totalframes),
+ (int)(FRAME_TIME * this->currentframe * 1000),
+ (int)(le2me_32(this->header.tta.data_length) * 1000.0 /
+ le2me_32(this->header.tta.samplerate)),
+ this->currentframe);
this->currentframe++;
diff --git a/src/demuxers/matroska.h b/src/demuxers/matroska.h
index 6109ad278..23e115edc 100644
--- a/src/demuxers/matroska.h
+++ b/src/demuxers/matroska.h
@@ -340,6 +340,7 @@ struct matroska_track_s {
#define MATROSKA_CODEC_ID_S_SSA "S_SSA" /* deprecated */
#define MATROSKA_CODEC_ID_S_ASS "S_ASS" /* deprecated */
#define MATROSKA_CODEC_ID_S_VOBSUB "S_VOBSUB"
+#define MATROSKA_CODEC_ID_S_HDMV_PGS "S_HDMV/PGS"
/* block lacing */
#define MATROSKA_NO_LACING 0x0