summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Roitzsch <mroi@users.sourceforge.net>2002-12-06 17:29:14 +0000
committerMichael Roitzsch <mroi@users.sourceforge.net>2002-12-06 17:29:14 +0000
commiteecfa8d81ad62f165bf4daee0ce9ded211ea7243 (patch)
tree23de6d1f6456815b9893ab04336e6f21c134fa74
parent9c1d67db798ae36fb7dfd8d66df49de68a50def3 (diff)
downloadxine-lib-eecfa8d81ad62f165bf4daee0ce9ded211ea7243.tar.gz
xine-lib-eecfa8d81ad62f165bf4daee0ce9ded211ea7243.tar.bz2
embed closed caption decoding again (needs testing)
CVS patchset: 3445 CVS date: 2002/12/06 17:29:14
-rw-r--r--src/libmpeg2/decode.c36
-rw-r--r--src/libmpeg2/mpeg2.h4
2 files changed, 28 insertions, 12 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index 5e6d73ca1..88a660cb8 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -696,6 +696,12 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec)
free (mpeg2dec->picture_base);
mpeg2dec->picture = NULL;
}
+
+ if ( mpeg2dec->cc_dec) {
+ /* dispose the closed caption decoder */
+ mpeg2dec->cc_dec->dispose(mpeg2dec->cc_dec);
+ mpeg2dec->cc_dec = NULL;
+ }
}
void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec,
@@ -767,17 +773,23 @@ static void process_userdata(mpeg2dec_t *mpeg2dec, uint8_t *buffer)
{
/* check if user data denotes closed captions */
if (buffer[0] == 'C' && buffer[1] == 'C') {
-#if 0
- /* FIXME: find an event-less solution */
- xine_closed_caption_event_t event;
- uint8_t *end = find_end(buffer);
-
- event.event.type = XINE_EVENT_CLOSED_CAPTION;
- event.buffer = &buffer[2];
- event.buf_len = end - &buffer[2];
- event.pts = mpeg2dec->pts;
- xine_send_event(mpeg2dec->xine, &event.event);
-#endif
-
+
+ if (!mpeg2dec->cc_dec)
+ /* open the closed caption decoder first */
+ mpeg2dec->cc_dec = get_spu_decoder(mpeg2dec->stream, (BUF_SPU_CC >> 16) & 0xff);
+
+ if (mpeg2dec->cc_dec) {
+ buf_element_t *buf;
+
+ buf = mpeg2dec->stream->video_fifo->buffer_pool_alloc (mpeg2dec->stream->video_fifo);
+ buf->type = BUF_SPU_CC;
+ buf->content = &buffer[2];
+ buf->pts = mpeg2dec->pts;
+ buf->size = find_end(buffer) - &buffer[2];
+
+ mpeg2dec->cc_dec->decode_data(mpeg2dec->cc_dec, buf);
+
+ buf->free_buffer(buf);
+ }
}
}
diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h
index 993bdffc4..bd966baeb 100644
--- a/src/libmpeg2/mpeg2.h
+++ b/src/libmpeg2/mpeg2.h
@@ -47,6 +47,10 @@ typedef struct mpeg2dec_s {
uint32_t rff_pattern;
int force_aspect;
xine_stream_t *stream;
+
+ /* a spu decoder for possible closed captions */
+ spu_decoder_t *cc_dec;
+
} mpeg2dec_t ;