summaryrefslogtreecommitdiff
path: root/src/libmpeg2
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-01-05 21:54:16 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-01-05 21:54:16 +0000
commit3517e658ee37cb82ba28a4e05fc708bba9e82af6 (patch)
tree87b06c4615628418db6f829a663d8bca06173b1f /src/libmpeg2
parentbb5d65d9f49e148de4f3b402d7a87956b05f5a4a (diff)
downloadxine-lib-3517e658ee37cb82ba28a4e05fc708bba9e82af6.tar.gz
xine-lib-3517e658ee37cb82ba28a4e05fc708bba9e82af6.tar.bz2
updates for closed caption decoder
CVS patchset: 1344 CVS date: 2002/01/05 21:54:16
Diffstat (limited to 'src/libmpeg2')
-rw-r--r--src/libmpeg2/decode.c48
-rw-r--r--src/libmpeg2/mpeg2.h9
-rw-r--r--src/libmpeg2/xine_decoder.c8
3 files changed, 56 insertions, 9 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index 98cc87268..bc7ad7758 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -33,6 +33,8 @@
#include "mpeg2.h"
#include "mpeg2_internal.h"
#include "xineutils.h"
+#include "xine_internal.h"
+#include "events.h"
#define BUFFER_SIZE (224 * 1024)
@@ -179,6 +181,10 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
break;
+ case 0xb2: /* user data code */
+ process_userdata(mpeg2dec, buffer);
+ break;
+
case 0xb3: /* sequence_header_code */
if (header_process_sequence_header (picture, buffer)) {
printf ("libmpeg2: bad sequence header\n");
@@ -186,10 +192,16 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
} else if (mpeg2dec->is_sequence_needed
|| (picture->frame_width != picture->coded_picture_width)
|| (picture->frame_height != picture->coded_picture_height)) {
-
+ xine_frame_change_event_t notify_event;
+
printf ("mpeg2dec: frame size has changed to from %d x %d to %d x %d\n",
picture->frame_width, picture->frame_height,
picture->coded_picture_width, picture->coded_picture_height);
+
+ notify_event.event.type = XINE_EVENT_FRAME_CHANGE;
+ notify_event.width = picture->coded_picture_width;
+ notify_event.height = picture->coded_picture_height;
+ xine_send_event(mpeg2dec->xine, &notify_event.event);
if (picture->forward_reference_frame)
picture->forward_reference_frame->free (picture->forward_reference_frame);
@@ -468,12 +480,19 @@ void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec,
}
if (mpeg2dec->is_sequence_needed) {
+ xine_frame_change_event_t notify_event;
+
mpeg2dec->is_sequence_needed = 0;
picture->frame_width = picture->coded_picture_width;
picture->frame_height = picture->coded_picture_height;
printf ("mpeg2dec: frame size %d x %d\n",
picture->frame_width, picture->frame_height);
+
+ notify_event.event.type = XINE_EVENT_FRAME_CHANGE;
+ notify_event.width = picture->coded_picture_width;
+ notify_event.height = picture->coded_picture_height;
+ xine_send_event(mpeg2dec->xine, &notify_event.event);
}
} else if (code == 0xb5) { /* extension_start_code */
if (header_process_extension (picture, mpeg2dec->chunk_buffer)) {
@@ -484,3 +503,30 @@ void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec,
}
}
+/* Find the end of the userdata field in an MPEG-2 stream */
+static uint8_t *find_end(uint8_t *buffer)
+{
+ uint8_t *current = buffer;
+ while(1) {
+ if (current[0] == 0 && current[1] == 0 && current[2] == 1)
+ break;
+ current++;
+ }
+ return current;
+}
+
+static void process_userdata(mpeg2dec_t *mpeg2dec, uint8_t *buffer)
+{
+ /* check if user data denotes closed captions */
+ if (buffer[0] == 'C' && buffer[1] == 'C') {
+ 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;
+ event.scr = mpeg2dec->scr;
+ xine_send_event(mpeg2dec->xine, &event.event);
+ }
+}
diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h
index 32ea7a72e..f1a09b5dd 100644
--- a/src/libmpeg2/mpeg2.h
+++ b/src/libmpeg2/mpeg2.h
@@ -44,13 +44,11 @@ typedef struct mpeg2dec_s {
uint8_t code;
uint32_t pts, scr;
-
+
+ xine_t *xine;
} mpeg2dec_t ;
-
-
-
/* initialize mpegdec with a opaque user pointer */
void mpeg2_init (mpeg2dec_t * mpeg2dec,
vo_instance_t * output);
@@ -65,5 +63,6 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec,
void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec,
uint8_t * data_start, uint8_t * data_end);
-
void mpeg2_flush (mpeg2dec_t * mpeg2dec);
+
+void process_userdata(mpeg2dec_t *mpeg2dec, uint8_t *buffer);
diff --git a/src/libmpeg2/xine_decoder.c b/src/libmpeg2/xine_decoder.c
index da55cab88..2f6a338bb 100644
--- a/src/libmpeg2/xine_decoder.c
+++ b/src/libmpeg2/xine_decoder.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_decoder.c,v 1.19 2001/12/24 00:45:03 guenter Exp $
+ * $Id: xine_decoder.c,v 1.20 2002/01/05 21:54:17 miguelfreitas Exp $
*
* stuff needed to turn libmpeg2 into a xine decoder plugin
*/
@@ -105,11 +105,11 @@ static char *mpeg2dec_get_id(void) {
return "mpeg2dec";
}
-video_decoder_t *init_video_decoder_plugin (int iface_version, config_values_t *cfg) {
+video_decoder_t *init_video_decoder_plugin (int iface_version, xine_t *xine) {
mpeg2dec_decoder_t *this ;
- if (iface_version != 4) {
+ if (iface_version != 5) {
printf( "libmpeg2: plugin doesn't support plugin API version %d.\n"
"libmpeg2: this means there's a version mismatch between xine and this "
"libmpeg2: decoder plugin.\nInstalling current plugins should help.\n",
@@ -129,6 +129,8 @@ video_decoder_t *init_video_decoder_plugin (int iface_version, config_values_t *
this->video_decoder.get_identifier = mpeg2dec_get_id;
this->video_decoder.priority = 1;
+ this->mpeg2.xine = xine;
+
return (video_decoder_t *) this;
}