diff options
Diffstat (limited to 'src/libmpeg2')
-rw-r--r-- | src/libmpeg2/decode.c | 48 | ||||
-rw-r--r-- | src/libmpeg2/mpeg2.h | 9 | ||||
-rw-r--r-- | src/libmpeg2/xine_decoder.c | 8 |
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, ¬ify_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, ¬ify_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; } |