summaryrefslogtreecommitdiff
path: root/xine/ts2es.c
diff options
context:
space:
mode:
Diffstat (limited to 'xine/ts2es.c')
-rw-r--r--xine/ts2es.c284
1 files changed, 0 insertions, 284 deletions
diff --git a/xine/ts2es.c b/xine/ts2es.c
deleted file mode 100644
index bb06d3ea..00000000
--- a/xine/ts2es.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * ts2es.c: demux MPEG-TS -> ES
- *
- * See the main source file 'xineliboutput.c' for copyright information and
- * how to reach the author.
- *
- * $Id: ts2es.c,v 1.5 2009-08-25 10:09:20 phintuka Exp $
- *
- */
-
-#include <stdlib.h>
-
-#include <xine/buffer.h>
-
-#include "../tools/ts.h"
-#include "../tools/pes.h"
-
-#include "ts2es.h"
-
-#define LOG_MODULENAME "[demux_vdr] "
-#define SysLogLevel iSysLogLevel
-#include "../logdefs.h"
-
-
-struct ts2es_s {
- fifo_buffer_t *fifo;
- uint32_t stream_type;
- uint32_t xine_buf_type;
-
- buf_element_t *buf;
- int pes_start;
- int first_pusi_seen;
- int video;
- int64_t pts;
-};
-
-
-static void ts2es_parse_pes(ts2es_t *this)
-{
- if (!DATA_IS_PES(this->buf->content)) {
- LOGMSG("ts2es: payload not PES ?");
- return;
- }
-
- /* parse PES header */
- uint hdr_len = PES_HEADER_LEN(this->buf->content);
- uint8_t pes_pid = this->buf->content[3];
- uint pes_len = (this->buf->content[4] << 8) | this->buf->content[5];
-
- /* parse PTS */
- this->buf->pts = pes_get_pts(this->buf->content, this->buf->size);
- if(this->buf->pts >= 0)
- this->pts = this->buf->pts;
- else
- this->pts = 0;
-
- /* strip PES header */
- this->buf->content += hdr_len;
- this->buf->size -= hdr_len;
-
- /* parse substream header */
-
- if (pes_pid != PRIVATE_STREAM1)
- return;
-
- /* RAW AC3 audio ? -> do nothing */
- if (this->stream_type == STREAM_AUDIO_AC3) {
- this->xine_buf_type |= BUF_AUDIO_A52;
- this->buf->type = this->xine_buf_type;
- return;
- }
-
- /* AC3 syncword in beginning of PS1 payload ? */
- if (this->buf->content[0] == 0x0B &&
- this->buf->content[1] == 0x77) {
- /* --> RAW AC3 audio - do nothing */
- this->xine_buf_type |= BUF_AUDIO_A52;
- this->buf->type = this->xine_buf_type;
- return;
- }
-
- /* audio in PS1 */
- if (this->stream_type == ISO_13818_PES_PRIVATE) {
-
- if ((this->buf->content[0] & 0xf0) == 0x80) {
- /* AC3, strip substream header */
- this->buf->content += 4;
- this->buf->size -= 4;
- this->xine_buf_type |= BUF_AUDIO_A52;
- this->buf->type = this->xine_buf_type;
- return;
- }
-
- if ((this->buf->content[0] & 0xf0) == 0xa0) {
- /* PCM, strip substream header */
- int pcm_offset;
- for (pcm_offset=0; ++pcm_offset < this->buf->size-1 ; ) {
- if (this->buf->content[pcm_offset] == 0x01 &&
- this->buf->content[pcm_offset+1] == 0x80 ) { /* START */
- pcm_offset += 2;
- break;
- }
- }
- this->buf->content += pcm_offset;
- this->buf->size -= pcm_offset;
-
- this->xine_buf_type |= BUF_AUDIO_LPCM_BE;
- this->buf->type = this->xine_buf_type;
- return;
- }
-
- LOGMSG("ts2es: unhandled PS1 substream 0x%x", this->buf->content[0]);
- return;
- }
-
- /* DVB SPU */
- if (this->stream_type == STREAM_DVBSUB) {
- if (this->buf->content[0] != 0x20 ||
- this->buf->content[1] != 0x00)
- LOGMSG("ts2es: DVB SPU, invalid PES substream header");
- this->buf->decoder_info[2] = pes_len - hdr_len - 3 + 9;
- return;
- }
-}
-
-buf_element_t *ts2es_put(ts2es_t *this, uint8_t *data, fifo_buffer_t *src_fifo)
-{
- buf_element_t *result = NULL;
- int bytes = ts_PAYLOAD_SIZE(data);
- int pusi = ts_PAYLOAD_START(data);
-
- if (ts_HAS_ERROR(data)) {
- LOGDBG("ts2es: transport error");
- return NULL;
- }
- if (!ts_HAS_PAYLOAD(data)) {
- LOGDBG("ts2es: no payload, size %d", bytes);
- return NULL;
- }
-
- /* handle new payload unit */
- if (pusi) {
- this->first_pusi_seen = 1;
- this->pes_start = 1;
- if (this->buf) {
-
- this->buf->decoder_flags |= BUF_FLAG_FRAME_END;
- this->buf->pts = this->pts;
-
- result = this->buf;
- this->buf = NULL;
- }
- }
-
- /* need new buffer ? */
- if (!this->buf) {
- /* discard data until first payload start indicator */
- if (!this->first_pusi_seen)
- return NULL;
-
- if (src_fifo && src_fifo != this->fifo) {
- if (!this->video)
- this->buf = this->fifo->buffer_pool_try_alloc(this->fifo);
- if (!this->buf)
- this->buf = src_fifo->buffer_pool_try_alloc(src_fifo);
- if (!this->buf)
- this->buf = this->fifo->buffer_pool_alloc(this->fifo);
- } else {
- this->buf = this->fifo->buffer_pool_alloc(this->fifo);
- }
-
- this->buf->type = this->xine_buf_type;
- this->buf->decoder_info[0] = 1;
- }
-
- /* strip ts header */
- data += TS_SIZE - bytes;
-
- /* copy payload */
- memcpy(this->buf->content + this->buf->size, data, bytes);
- this->buf->size += bytes;
-
- /* parse PES header */
- if (this->pes_start) {
- this->pes_start = 0;
-
- ts2es_parse_pes(this);
- }
-
- /* split large packets */
- if ((this->video && this->buf->size >= 2048+64-TS_SIZE) ||
- this->buf->size >= this->buf->max_size-TS_SIZE) {
-
- this->buf->pts = this->pts;
-
- result = this->buf;
- this->buf = NULL;
- }
-
- return result;
-}
-
-void ts2es_flush(ts2es_t *this)
-{
- if (this->buf) {
-
- this->buf->decoder_flags |= BUF_FLAG_FRAME_END;
- this->buf->pts = this->pts;
-
- this->fifo->put (this->fifo, this->buf);
- this->buf = NULL;
- }
-}
-
-void ts2es_dispose(ts2es_t *data)
-{
- if (data) {
- if (data->buf)
- data->buf->free_buffer(data->buf);
- free(data);
- }
-}
-
-ts2es_t *ts2es_init(fifo_buffer_t *dst_fifo, ts_stream_type stream_type, uint stream_index)
-{
- ts2es_t *data = calloc(1, sizeof(ts2es_t));
- data->fifo = dst_fifo;
-
- data->stream_type = stream_type;
-
- switch(stream_type) {
- /* VIDEO (PES streams 0xe0...0xef) */
- case ISO_11172_VIDEO:
- case ISO_13818_VIDEO:
- case STREAM_VIDEO_MPEG:
- data->xine_buf_type = BUF_VIDEO_MPEG;
- break;
- case ISO_14496_PART2_VIDEO:
- data->xine_buf_type = BUF_VIDEO_MPEG4;
- break;
- case ISO_14496_PART10_VIDEO:
- data->xine_buf_type = BUF_VIDEO_H264;
- break;
-
- /* AUDIO (PES streams 0xc0...0xdf) */
- case ISO_11172_AUDIO:
- case ISO_13818_AUDIO:
- data->xine_buf_type = BUF_AUDIO_MPEG;
- break;
- case ISO_13818_PART7_AUDIO:
- case ISO_14496_PART3_AUDIO:
- data->xine_buf_type = BUF_AUDIO_AAC;
- break;
-
- /* AUDIO (PES stream 0xbd) */
- case ISO_13818_PES_PRIVATE:
- data->xine_buf_type = 0;
- /* detect from PES substream header */
- break;
-
- /* DVB SPU (PES stream 0xbd) */
- case STREAM_DVBSUB:
- data->xine_buf_type = BUF_SPU_DVB;
- break;
-
- /* RAW AC3 */
- case STREAM_AUDIO_AC3:
- data->xine_buf_type = BUF_AUDIO_A52;
- break;
-
- default:
- LOGMSG("ts2es: unknown stream type 0x%x", stream_type);
- break;
- }
-
- /* substream ID (audio/SPU) */
- data->xine_buf_type |= stream_index;
-
- if ((data->xine_buf_type & BUF_MAJOR_MASK) == BUF_VIDEO_BASE)
- data->video = 1;
-
- return data;
-}
-