1 Index: xine-lib/configure.ac
2 ===================================================================
3 RCS file: /cvsroot/xine/xine-lib/configure.ac,v
4 retrieving revision 1.356
5 diff -u -r1.356 configure.ac
6 --- xine-lib/configure.ac 5 Feb 2006 13:59:45 -0000 1.356
7 +++ xine-lib/configure.ac 20 Mar 2006 21:11:58 -0000
9 src/video_out/vidix/drivers/Makefile
10 src/xine-utils/Makefile
11 src/xine-engine/Makefile
14 win32/include/Makefile])
15 AC_CONFIG_COMMANDS([default],[[chmod +x ./misc/SlackBuild ./misc/build_rpms.sh ./misc/relchk.sh]],[[]])
17 echo " - stdin_fifo - rtp"
22 if test x"$external_dvdnav" = "xyes"; then
23 echo " - dvd (external libs)"
27 echo " - boxblur - denoise3d"
28 echo " - unsharp - tvtime"
31 echo " - goom - oscope"
32 echo " - fftscope - mosaico"
33 Index: xine-lib/src/Makefile.am
34 ===================================================================
35 RCS file: /cvsroot/xine/xine-lib/src/Makefile.am,v
36 retrieving revision 1.54
37 diff -u -r1.54 Makefile.am
38 --- xine-lib/src/Makefile.am 14 Jan 2005 15:24:08 -0000 1.54
39 +++ xine-lib/src/Makefile.am 20 Mar 2006 21:11:59 -0000
47 Index: xine-lib/src/libmpeg2/decode.c
48 ===================================================================
49 RCS file: /cvsroot/xine/xine-lib/src/libmpeg2/decode.c,v
50 retrieving revision 1.130
51 diff -u -r1.130 decode.c
52 --- xine-lib/src/libmpeg2/decode.c 19 Feb 2006 15:05:07 -0000 1.130
53 +++ xine-lib/src/libmpeg2/decode.c 20 Mar 2006 21:12:02 -0000
57 static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
59 + uint8_t * buffer, int next_code)
68 + /* according to ISO/IEC 13818-2, an extension start code will follow.
69 + * Otherwise the stream follows ISO/IEC 11172-2 which means MPEG1 */
70 + picture->mpeg1 = (next_code != 0xb5);
72 if (mpeg2dec->force_aspect) picture->aspect_ratio_information = mpeg2dec->force_aspect;
74 if (mpeg2dec->is_sequence_needed ) {
75 @@ -589,45 +594,135 @@
79 +static inline int find_start_code (mpeg2dec_t * mpeg2dec,
80 + uint8_t ** current, uint8_t * limit)
84 + if (*current >= limit)
86 + if (mpeg2dec->shift == 0x00000100)
89 + mpeg2dec->shift = (mpeg2dec->shift | *(*current)++) << 8;
91 + if (*current >= limit)
93 + if (mpeg2dec->shift == 0x00000100)
96 + mpeg2dec->shift = (mpeg2dec->shift | *(*current)++) << 8;
98 + if (*current >= limit)
100 + if (mpeg2dec->shift == 0x00000100)
105 + if (*current >= limit) {
106 + mpeg2dec->shift = (mpeg2dec->shift | *(*current)++) << 8;
112 + while (p < limit && (p = (uint8_t *)memchr(p, 0x01, limit - p))) {
113 + if (p[-2] || p[-1])
121 + *current = ++limit;
123 + mpeg2dec->shift = (mpeg2dec->shift | *p++) << 8;
124 + mpeg2dec->shift = (mpeg2dec->shift | *p++) << 8;
125 + mpeg2dec->shift = (mpeg2dec->shift | *p++) << 8;
130 static inline uint8_t * copy_chunk (mpeg2dec_t * mpeg2dec,
131 uint8_t * current, uint8_t * end)
134 - uint8_t * chunk_ptr;
138 - shift = mpeg2dec->shift;
139 - chunk_ptr = mpeg2dec->chunk_ptr;
140 - limit = current + (mpeg2dec->chunk_buffer + BUFFER_SIZE - chunk_ptr);
141 + /* sequence end code 0xb7 doesn't have any data and there might be the case
142 + * that no start code will follow this code for quite some time (e. g. in case
143 + * of a still image.
144 + * Therefore, return immediately with a chunk_size of 0. Setting code to 0xb4
145 + * will eat up any trailing garbage next time.
147 + if (mpeg2dec->code == 0xb7) {
148 + mpeg2dec->code = 0xb4;
149 + mpeg2dec->chunk_size = 0;
153 + limit = current + (mpeg2dec->chunk_buffer + BUFFER_SIZE - mpeg2dec->chunk_ptr);
158 + uint32_t shift = mpeg2dec->shift;
159 + uint8_t * chunk_ptr = mpeg2dec->chunk_ptr;
165 - if (shift != 0x00000100) {
166 - shift = (shift | byte) << 8;
167 - *chunk_ptr++ = byte;
168 - if (current < limit)
170 - if (current == end) {
171 - mpeg2dec->chunk_ptr = chunk_ptr;
172 - mpeg2dec->shift = shift;
175 - /* we filled the chunk buffer without finding a start code */
176 - mpeg2dec->code = 0xb4; /* sequence_error_code */
177 - mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
179 + uint8_t byte = *current++;
180 + if (shift != 0x00000100) {
181 + shift = (shift | byte) << 8;
182 + *chunk_ptr++ = byte;
183 + if (current < limit)
185 + if (current == end) {
186 + mpeg2dec->chunk_ptr = chunk_ptr;
187 + mpeg2dec->shift = shift;
190 + /* we filled the chunk buffer without finding a start code */
191 + mpeg2dec->code = 0xb4; /* sequence_error_code */
192 + mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
196 + mpeg2dec->code = byte;
197 + mpeg2dec->chunk_size = chunk_ptr - mpeg2dec->chunk_buffer - 3;
198 + mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
199 + mpeg2dec->shift = 0xffffff00;
202 - mpeg2dec->code = byte;
203 - mpeg2dec->chunk_size = chunk_ptr - mpeg2dec->chunk_buffer - 3;
207 + uint8_t * data = current;
208 + int found = find_start_code(mpeg2dec, ¤t, limit);
209 + int bite = current - data;
211 + xine_fast_memcpy(mpeg2dec->chunk_ptr, data, bite);
212 + mpeg2dec->chunk_ptr += bite;
216 + mpeg2dec->code = *current++;
217 + mpeg2dec->chunk_size = mpeg2dec->chunk_ptr - mpeg2dec->chunk_buffer - 3;
218 + mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
219 + mpeg2dec->shift = 0xffffff00;
223 + if (current == end)
226 + /* we filled the chunk buffer without finding a start code */
227 + mpeg2dec->code = 0xb4; /* sequence_error_code */
228 mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
229 - mpeg2dec->shift = 0xffffff00;
235 int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end,
236 @@ -648,12 +743,12 @@
240 - while (current != end) {
241 + while (current != end || mpeg2dec->code == 0xb7) {
242 code = mpeg2dec->code;
243 current = copy_chunk (mpeg2dec, current, end);
246 - ret += parse_chunk (mpeg2dec, code, mpeg2dec->chunk_buffer);
247 + ret += parse_chunk (mpeg2dec, code, mpeg2dec->chunk_buffer, mpeg2dec->code);
250 libmpeg2_accel_frame_completion(&mpeg2dec->accel, mpeg2dec->frame_format,
252 void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec,
253 uint8_t * current, uint8_t * end){
256 + uint8_t code, next_code;
257 picture_t *picture = mpeg2dec->picture;
259 mpeg2dec->seek_mode = 1;
261 current = copy_chunk (mpeg2dec, current, end);
264 + next_code = mpeg2dec->code;
266 /* printf ("looking for sequence header... %02x\n", code); */
269 printf ("libmpeg2: bad sequence header\n");
273 + /* according to ISO/IEC 13818-2, an extension start code will follow.
274 + * Otherwise the stream follows ISO/IEC 11172-2 which means MPEG1 */
275 + picture->mpeg1 = (next_code != 0xb5);
277 if (mpeg2dec->force_aspect) picture->aspect_ratio_information = mpeg2dec->force_aspect;
279 if (mpeg2dec->is_sequence_needed) {
280 Index: xine-lib/src/post/planar/expand.c
281 ===================================================================
282 RCS file: /cvsroot/xine/xine-lib/src/post/planar/expand.c,v
283 retrieving revision 1.15
284 diff -u -r1.15 expand.c
285 --- xine-lib/src/post/planar/expand.c 27 Jan 2006 07:46:14 -0000 1.15
286 +++ xine-lib/src/post/planar/expand.c 20 Mar 2006 21:12:04 -0000
289 * expand video filter by James Stembridge 24/05/2003
290 * improved by Michael Roitzsch
292 + * centre_crop_out_mode by Reinhard Nissl
298 * This way, the decoder (or any other post plugin up the tree) will only
299 * see the frame area between the black bars and by that modify the
300 * enlarged version directly. No need for later copying.
302 + * When centre_crop_out_mode is enabled, the plugin will detect the black
303 + * bars to the left and right of the image and will then set up cropping
304 + * to efficiently remove the black border around the 4:3 image, which the
305 + * plugin would produce otherwise for this case.
310 int enable_automatic_shift;
311 int overlay_y_offset;
313 + int centre_cut_out_mode;
314 } expand_parameters_t;
316 START_PARAM_DESCR(expand_parameters_t)
318 "manually shift the overlay vertically")
319 PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, aspect, NULL, 1.0, 3.5, 0,
320 "target aspect ratio")
321 +PARAM_ITEM(POST_PARAM_TYPE_BOOL, centre_cut_out_mode, NULL, 0, 1, 0,
322 + "cut out centered 4:3 image contained in 16:9 frame")
323 END_PARAM_DESCR(expand_param_descr)
325 typedef struct post_expand_s {
327 int overlay_y_offset;
330 + int centre_cut_out_mode;
331 + int cropping_active;
334 /* plugin class functions */
336 uint32_t height, double ratio,
337 int format, int flags);
339 +/* replaced vo_frame functions */
340 +static int expand_draw(vo_frame_t *frame, xine_stream_t *stream);
342 /* overlay manager intercept check */
343 static int expand_intercept_ovl(post_video_port_t *port);
345 @@ -152,11 +166,14 @@
346 this->enable_automatic_shift = 0;
347 this->overlay_y_offset = 0;
348 this->aspect = 4.0 / 3.0;
349 + this->centre_cut_out_mode = 0;
350 + this->cropping_active = 0;
352 port = _x_post_intercept_video_port(&this->post, video_target[0], &input, &output);
353 port->new_port.get_frame = expand_get_frame;
354 port->intercept_ovl = expand_intercept_ovl;
355 port->new_manager->add_event = expand_overlay_add_event;
356 + port->new_frame->draw = expand_draw;
358 input_param = &this->parameter_input;
359 input_param->name = "parameters";
361 input_param->data = &post_api;
362 xine_list_push_back(this->post.input, input_param);
364 - input->xine_in.name = "video";
365 - output->xine_out.name = "expanded video";
366 + input->xine_in.name = "video";
367 + output->xine_out.name = "expanded video";
369 this->post.xine_post.video_input[0] = &port->new_port;
372 this->enable_automatic_shift = param->enable_automatic_shift;
373 this->overlay_y_offset = param->overlay_y_offset;
374 this->aspect = param->aspect;
375 + this->centre_cut_out_mode = param->centre_cut_out_mode;
381 param->enable_automatic_shift = this->enable_automatic_shift;
382 param->overlay_y_offset = this->overlay_y_offset;
383 param->aspect = this->aspect;
384 + param->centre_cut_out_mode = this->centre_cut_out_mode;
390 " Enable_automatic_shift: Enable automatic overlay shifting\n"
391 " Overlay_y_offset: Manually shift the overlay vertically\n"
392 " aspect: The target aspect ratio (default 4:3)\n"
393 + " Centre_cut_out_mode: extracts 4:3 image contained in 16:9 frame\n"
399 static int expand_intercept_ovl(post_video_port_t *port)
401 + post_expand_t *this = (post_expand_t *)port->post;
403 + if (this->centre_cut_out_mode && this->cropping_active) return 0;
405 /* we always intercept overlay manager */
410 return port->original_manager->add_event(port->original_manager, event_gen);
414 +static int is_pixel_black(vo_frame_t *frame, int x, int y)
416 + int Y = 0x00, Cr = 0x00, Cb = 0x00;
419 + if (x >= frame->width) x = frame->width - 1;
421 + if (y >= frame->height) y = frame->height - 1;
423 + switch (frame->format)
425 + case XINE_IMGFMT_YV12:
426 + Y = *(frame->base[ 0 ] + frame->pitches[ 0 ] * y + x);
427 + Cr = *(frame->base[ 1 ] + frame->pitches[ 1 ] * y / 2 + x / 2);
428 + Cb = *(frame->base[ 2 ] + frame->pitches[ 2 ] * y / 2 + x / 2);
431 + case XINE_IMGFMT_YUY2:
432 + Y = *(frame->base[ 0 ] + frame->pitches[ 0 ] * y + x * 2 + 0);
434 + Cr = *(frame->base[ 0 ] + frame->pitches[ 0 ] * y + x * 2 + 1);
435 + Cb = *(frame->base[ 0 ] + frame->pitches[ 0 ] * y + x * 2 + 3);
439 + return (Y == 0x10 && Cr == 0x80 && Cb == 0x80);
443 +static int expand_draw(vo_frame_t *frame, xine_stream_t *stream)
445 + post_video_port_t *port = (post_video_port_t *)frame->port;
446 + post_expand_t *this = (post_expand_t *)port->post;
449 + if (this->centre_cut_out_mode && !frame->bad_frame)
451 + /* expected area of inner 4:3 image */
452 + int centre_width = frame->width * (9 * 4) / (16 * 3);
453 + int centre_left = (frame->width - centre_width ) / 2;
455 + /* centre point for detecting a black frame */
456 + int centre_x = frame->width / 2;
457 + int centre_y = frame->height / 2;
459 + /* ignore a black frame as it could lead to wrong results */
460 + if (!is_pixel_black(frame, centre_x, centre_y))
462 + /* coordinates for testing black border near the centre area */
463 + int test_left = centre_left - 16;
464 + int test_right = centre_left + 16 + centre_width;
466 + /* enable cropping when these pixels are black */
467 + this->cropping_active = is_pixel_black(frame, test_left, centre_y)
468 + && is_pixel_black(frame, test_right, centre_y);
472 + if (this->centre_cut_out_mode && this->cropping_active) {
473 + frame->crop_left += centre_left;
474 + frame->crop_right += centre_left;
476 + /* get_frame() allocated an extra high frame */
477 + frame->crop_top += (frame->next->height - frame->height) / 2;
478 + frame->crop_bottom += (frame->next->height - frame->height) / 2;
482 + _x_post_frame_copy_down(frame, frame->next);
483 + skip = frame->next->draw(frame->next, stream);
484 + _x_post_frame_copy_up(frame, frame->next);
488 Index: xine-lib/src/xine-engine/audio_out.c
489 ===================================================================
490 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/audio_out.c,v
491 retrieving revision 1.198
492 diff -u -r1.198 audio_out.c
493 --- xine-lib/src/xine-engine/audio_out.c 7 Mar 2006 08:03:22 -0000 1.198
494 +++ xine-lib/src/xine-engine/audio_out.c 20 Mar 2006 21:12:07 -0000
495 @@ -1034,6 +1034,10 @@
499 + if ((in_buf->vpts - cur_time) > 2*90000 )
500 + xprintf(this->xine, XINE_VERBOSITY_DEBUG,
501 + "audio_out: vpts/clock error, in_buf->vpts=%" PRId64 " cur_time=%" PRId64 "\n", in_buf->vpts, cur_time);
503 lprintf ("loop:pause: I feel sleepy (%d buffers).\n", this->out_fifo->num_buffers);
504 xine_usec_sleep (10000);
505 lprintf ("loop:pause: I wake up.\n");
506 Index: xine-lib/src/xine-engine/demux.c
507 ===================================================================
508 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/demux.c,v
509 retrieving revision 1.61
510 diff -u -r1.61 demux.c
511 --- xine-lib/src/xine-engine/demux.c 24 Jan 2006 22:25:34 -0000 1.61
512 +++ xine-lib/src/xine-engine/demux.c 20 Mar 2006 21:12:08 -0000
514 stream->video_fifo->clear(stream->video_fifo);
515 stream->audio_fifo->clear(stream->audio_fifo);
517 + pthread_mutex_lock(&stream->demux_mutex);
519 buf = stream->video_fifo->buffer_pool_alloc (stream->video_fifo);
520 buf->type = BUF_CONTROL_RESET_DECODER;
521 stream->video_fifo->put (stream->video_fifo, buf);
523 buf->type = BUF_CONTROL_RESET_DECODER;
524 stream->audio_fifo->put (stream->audio_fifo, buf);
526 + pthread_mutex_unlock(&stream->demux_mutex);
528 /* on seeking we must wait decoder fifos to process before doing flush.
529 * otherwise we flush too early (before the old data has left decoders)
535 + pthread_mutex_lock(&stream->demux_mutex);
537 buf = stream->video_fifo->buffer_pool_alloc (stream->video_fifo);
538 buf->type = BUF_CONTROL_NEWPTS;
539 buf->decoder_flags = flags;
541 buf->decoder_flags = flags;
543 stream->audio_fifo->put (stream->audio_fifo, buf);
545 + pthread_mutex_unlock(&stream->demux_mutex);
548 /* sync with decoder fifos, making sure everything gets processed */
549 @@ -165,12 +173,16 @@
550 header_count_audio = 0;
553 + pthread_mutex_lock(&stream->demux_mutex);
555 buf_video->type = BUF_CONTROL_HEADERS_DONE;
556 stream->video_fifo->put (stream->video_fifo, buf_video);
558 buf_audio->type = BUF_CONTROL_HEADERS_DONE;
559 stream->audio_fifo->put (stream->audio_fifo, buf_audio);
561 + pthread_mutex_unlock(&stream->demux_mutex);
563 while ((stream->header_count_audio < header_count_audio) ||
564 (stream->header_count_video < header_count_video)) {
570 + pthread_mutex_lock(&stream->demux_mutex);
572 buf = stream->video_fifo->buffer_pool_alloc (stream->video_fifo);
573 buf->type = BUF_CONTROL_START;
574 stream->video_fifo->put (stream->video_fifo, buf);
575 @@ -205,12 +219,16 @@
576 buf = stream->audio_fifo->buffer_pool_alloc (stream->audio_fifo);
577 buf->type = BUF_CONTROL_START;
578 stream->audio_fifo->put (stream->audio_fifo, buf);
580 + pthread_mutex_unlock(&stream->demux_mutex);
583 void _x_demux_control_end( xine_stream_t *stream, uint32_t flags ) {
587 + pthread_mutex_lock(&stream->demux_mutex);
589 buf = stream->video_fifo->buffer_pool_alloc (stream->video_fifo);
590 buf->type = BUF_CONTROL_END;
591 buf->decoder_flags = flags;
592 @@ -220,12 +238,16 @@
593 buf->type = BUF_CONTROL_END;
594 buf->decoder_flags = flags;
595 stream->audio_fifo->put (stream->audio_fifo, buf);
597 + pthread_mutex_unlock(&stream->demux_mutex);
600 void _x_demux_control_nop( xine_stream_t *stream, uint32_t flags ) {
604 + pthread_mutex_lock(&stream->demux_mutex);
606 buf = stream->video_fifo->buffer_pool_alloc (stream->video_fifo);
607 buf->type = BUF_CONTROL_NOP;
608 buf->decoder_flags = flags;
610 buf->type = BUF_CONTROL_NOP;
611 buf->decoder_flags = flags;
612 stream->audio_fifo->put (stream->audio_fifo, buf);
614 + pthread_mutex_unlock(&stream->demux_mutex);
617 static void *demux_loop (void *stream_gen) {
618 Index: xine-lib/src/xine-engine/post.c
619 ===================================================================
620 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/post.c,v
621 retrieving revision 1.32
622 diff -u -r1.32 post.c
623 --- xine-lib/src/xine-engine/post.c 27 Jan 2006 07:46:15 -0000 1.32
624 +++ xine-lib/src/xine-engine/post.c 20 Mar 2006 21:12:09 -0000
626 if (port->port_lock) pthread_mutex_unlock(port->port_lock);
629 +static void post_video_trigger_drawing(xine_video_port_t *port_gen) {
630 + post_video_port_t *port = (post_video_port_t *)port_gen;
632 + if (port->port_lock) pthread_mutex_lock(port->port_lock);
633 + port->original_port->trigger_drawing(port->original_port);
634 + if (port->port_lock) pthread_mutex_unlock(port->port_lock);
637 static int post_video_status(xine_video_port_t *port_gen, xine_stream_t *stream,
638 int *width, int *height, int64_t *img_duration) {
639 post_video_port_t *port = (post_video_port_t *)port_gen;
641 port->new_port.exit = post_video_exit;
642 port->new_port.get_overlay_manager = post_video_get_overlay_manager;
643 port->new_port.flush = post_video_flush;
644 + port->new_port.trigger_drawing = post_video_trigger_drawing;
645 port->new_port.status = post_video_status;
646 port->new_port.get_property = post_video_get_property;
647 port->new_port.set_property = post_video_set_property;
648 Index: xine-lib/src/xine-engine/video_out.c
649 ===================================================================
650 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_out.c,v
651 retrieving revision 1.223
652 diff -u -r1.223 video_out.c
653 --- xine-lib/src/xine-engine/video_out.c 27 Jan 2006 07:46:15 -0000 1.223
654 +++ xine-lib/src/xine-engine/video_out.c 20 Mar 2006 21:12:10 -0000
656 int frame_drop_limit;
658 int crop_left, crop_right, crop_top, crop_bottom;
660 + pthread_mutex_t trigger_drawing_mutex;
661 + pthread_cond_t trigger_drawing;
666 vo_append_to_img_buf_queue (this->display_img_buf_queue, img);
669 + fprintf (stderr, "bad_frame\n");
670 lprintf ("bad_frame\n");
673 @@ -1039,6 +1043,24 @@
674 this->redraw_needed = 1;
677 +static int interruptable_sleep(vos_t *this, int usec_to_sleep)
679 + struct timespec abstime;
681 + struct timeval now;
682 + gettimeofday(&now, 0);
684 + abstime.tv_sec = now.tv_sec + usec_to_sleep / 1000000;
685 + abstime.tv_nsec = now.tv_usec * 1000 + (usec_to_sleep % 1000000) * 1000;
687 + if (abstime.tv_nsec > 1000000000) {
688 + abstime.tv_nsec -= 1000000000;
692 + return pthread_cond_timedwait(&this->trigger_drawing, &this->trigger_drawing_mutex, &abstime);
695 /* special loop for paused mode
696 * needed to update screen due overlay changes, resize, window
697 * movement, brightness adjusting etc.
698 @@ -1084,7 +1106,7 @@
701 pthread_mutex_unlock( &this->free_img_buf_queue->mutex );
702 - xine_usec_sleep (20000);
703 + interruptable_sleep(this, 20000);
704 pthread_mutex_lock( &this->free_img_buf_queue->mutex );
707 @@ -1112,6 +1134,8 @@
711 + pthread_mutex_lock(&this->trigger_drawing_mutex);
714 * here it is - the heart of xine (or rather: one of the hearts
715 * of xine) : the video output loop
716 @@ -1214,7 +1238,10 @@
717 "video_out: vpts/clock error, next_vpts=%" PRId64 " cur_vpts=%" PRId64 "\n", next_frame_vpts,vpts);
719 if (usec_to_sleep > 0)
720 - xine_usec_sleep (usec_to_sleep);
722 + if (0 == interruptable_sleep(this, usec_to_sleep))
726 if (this->discard_frames)
728 @@ -1222,6 +1249,8 @@
729 } while ( (usec_to_sleep > 0) && this->video_loop_running);
732 + pthread_mutex_unlock(&this->trigger_drawing_mutex);
735 * throw away undisplayed frames
737 @@ -1597,6 +1626,9 @@
738 free (this->free_img_buf_queue);
739 free (this->display_img_buf_queue);
741 + pthread_cond_destroy(&this->trigger_drawing);
742 + pthread_mutex_destroy(&this->trigger_drawing_mutex);
747 @@ -1666,6 +1698,14 @@
751 +static void vo_trigger_drawing (xine_video_port_t *this_gen) {
752 + vos_t *this = (vos_t *) this_gen;
754 + pthread_mutex_lock (&this->trigger_drawing_mutex);
755 + pthread_cond_signal (&this->trigger_drawing);
756 + pthread_mutex_unlock (&this->trigger_drawing_mutex);
759 /* crop_frame() will allocate a new frame to copy in the given image
760 * while cropping. maybe someday this will be an automatic post plugin.
762 @@ -1761,6 +1801,7 @@
763 this->vo.enable_ovl = vo_enable_overlay;
764 this->vo.get_overlay_manager = vo_get_overlay_manager;
765 this->vo.flush = vo_flush;
766 + this->vo.trigger_drawing = vo_trigger_drawing;
767 this->vo.get_property = vo_get_property;
768 this->vo.set_property = vo_set_property;
769 this->vo.status = vo_status;
770 @@ -1780,6 +1821,9 @@
771 this->overlay_source->init (this->overlay_source);
772 this->overlay_enabled = 1;
774 + pthread_mutex_init(&this->trigger_drawing_mutex, NULL);
775 + pthread_cond_init(&this->trigger_drawing, NULL);
777 this->frame_drop_limit = 3;
778 this->frame_drop_cpt = 0;
780 Index: xine-lib/src/xine-engine/video_out.h
781 ===================================================================
782 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_out.h,v
783 retrieving revision 1.113
784 diff -u -r1.113 video_out.h
785 --- xine-lib/src/xine-engine/video_out.h 24 Sep 2005 19:08:26 -0000 1.113
786 +++ xine-lib/src/xine-engine/video_out.h 20 Mar 2006 21:12:11 -0000
788 /* flush video_out fifo */
789 void (*flush) (xine_video_port_t *self);
791 + /* trigger immediate drawing */
792 + void (*trigger_drawing) (xine_video_port_t *self);
794 /* Get/Set video property
796 * See VO_PROP_* bellow
797 Index: xine-lib/src/xine-engine/video_overlay.h
798 ===================================================================
799 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_overlay.h,v
800 retrieving revision 1.20
801 diff -u -r1.20 video_overlay.h
802 --- xine-lib/src/xine-engine/video_overlay.h 24 Sep 2005 19:08:26 -0000 1.20
803 +++ xine-lib/src/xine-engine/video_overlay.h 20 Mar 2006 21:12:12 -0000
806 #define MAX_OBJECTS 50
807 #define MAX_EVENTS 50
808 -#define MAX_SHOWING 16
809 +#define MAX_SHOWING (5 + 16)
811 #define OVERLAY_EVENT_NULL 0
812 #define OVERLAY_EVENT_SHOW 1
813 Index: xine-lib/src/xine-engine/xine.c
814 ===================================================================
815 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/xine.c,v
816 retrieving revision 1.322
817 diff -u -r1.322 xine.c
818 --- xine-lib/src/xine-engine/xine.c 17 Mar 2006 18:52:04 -0000 1.322
819 +++ xine-lib/src/xine-engine/xine.c 20 Mar 2006 21:12:14 -0000
821 pthread_mutex_init (&stream->info_mutex, NULL);
822 pthread_mutex_init (&stream->meta_mutex, NULL);
823 pthread_mutex_init (&stream->demux_lock, NULL);
824 + pthread_mutex_init (&stream->demux_mutex, NULL);
825 pthread_mutex_init (&stream->event_queues_lock, NULL);
826 pthread_mutex_init (&stream->counter_lock, NULL);
827 pthread_cond_init (&stream->counter_changed, NULL);
828 @@ -1269,6 +1270,7 @@
829 pthread_mutex_destroy (&stream->event_queues_lock);
830 pthread_mutex_destroy (&stream->current_extra_info_lock);
831 pthread_cond_destroy (&stream->counter_changed);
832 + pthread_mutex_destroy (&stream->demux_mutex);
833 pthread_mutex_destroy (&stream->demux_lock);
834 pthread_mutex_destroy (&stream->first_frame_lock);
835 pthread_cond_destroy (&stream->first_frame_reached);
836 @@ -1948,3 +1950,89 @@
837 slave->master = master->master;
841 +int _x_continue_stream_processing(xine_stream_t *stream)
843 + return stream->status != XINE_STATUS_STOP
844 + && stream->status != XINE_STATUS_QUIT;
847 +void _x_trigger_relaxed_frame_drop_mode(xine_stream_t *stream)
849 + stream->first_frame_flag = 2;
852 +void _x_reset_relaxed_frame_drop_mode(xine_stream_t *stream)
854 + stream->first_frame_flag = 1;
857 +void _x_query_buffer_usage(xine_stream_t *stream, int *num_video_buffers, int *num_audio_buffers, int *num_video_frames, int *num_audio_frames)
859 + stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
861 + if (num_video_buffers)
862 + *num_video_buffers = (stream->video_fifo ? stream->video_fifo->size(stream->video_fifo) : 0);
864 + if (num_audio_buffers)
865 + *num_audio_buffers = (stream->audio_fifo ? stream->audio_fifo->size(stream->audio_fifo) : 0);
867 + if (num_video_frames)
868 + *num_video_frames = (stream->video_out ? stream->video_out->get_property(stream->video_out, VO_PROP_BUFS_IN_FIFO) : 0);
870 + if (num_audio_frames)
871 + *num_audio_frames = (stream->audio_out ? stream->audio_out->get_property(stream->audio_out, AO_PROP_BUFS_IN_FIFO) : 0);
873 + stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
876 +int _x_query_unprocessed_osd_events(xine_stream_t *stream)
878 + video_overlay_manager_t *ovl;
881 + stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
883 + ovl = stream->video_out->get_overlay_manager(stream->video_out);
884 + redraw_needed = ovl->redraw_needed(ovl, 0);
887 + stream->video_out->trigger_drawing(stream->video_out);
889 + stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
891 + return redraw_needed;
894 +int _x_demux_seek(xine_stream_t *stream, off_t start_pos, int start_time, int playing)
896 + return stream->demux_plugin->seek(stream->demux_plugin, start_pos, start_time, playing);
899 +int _x_lock_frontend(xine_stream_t *stream, int ms_to_time_out)
901 + if (ms_to_time_out >= 0) {
902 + struct timespec abstime;
904 + struct timeval now;
905 + gettimeofday(&now, 0);
907 + abstime.tv_sec = now.tv_sec + ms_to_time_out / 1000;
908 + abstime.tv_nsec = now.tv_usec * 1000 + (ms_to_time_out % 1000) * 1e6;
910 + if (abstime.tv_nsec > 1e9) {
911 + abstime.tv_nsec -= 1e9;
915 + return (0 == pthread_mutex_timedlock(&stream->frontend_lock, &abstime));
918 + pthread_mutex_lock(&stream->frontend_lock);
922 +void _x_unlock_frontend(xine_stream_t *stream)
924 + pthread_mutex_unlock(&stream->frontend_lock);
926 Index: xine-lib/src/xine-engine/xine_internal.h
927 ===================================================================
928 RCS file: /cvsroot/xine/xine-lib/src/xine-engine/xine_internal.h,v
929 retrieving revision 1.171
930 diff -u -r1.171 xine_internal.h
931 --- xine-lib/src/xine-engine/xine_internal.h 27 Jan 2006 07:46:16 -0000 1.171
932 +++ xine-lib/src/xine-engine/xine_internal.h 20 Mar 2006 21:12:14 -0000
934 int demux_thread_running;
935 pthread_mutex_t demux_lock;
936 int demux_action_pending;
937 + pthread_mutex_t demux_mutex; /* used in _x_demux_... functions to synchronize order of pairwise A/V buffer operations */
939 extra_info_t *current_extra_info;
940 pthread_mutex_t current_extra_info_lock;
942 * private function prototypes:
945 +int _x_continue_stream_processing(xine_stream_t *stream);
946 +void _x_trigger_relaxed_frame_drop_mode(xine_stream_t *stream);
947 +void _x_reset_relaxed_frame_drop_mode(xine_stream_t *stream);
948 +void _x_query_buffer_usage(xine_stream_t *stream, int *num_video_buffers, int *num_audio_buffers, int *num_video_frames, int *num_audio_frames);
949 +int _x_query_unprocessed_osd_events(xine_stream_t *stream);
950 +int _x_demux_seek(xine_stream_t *stream, off_t start_pos, int start_time, int playing);
951 +int _x_lock_frontend(xine_stream_t *stream, int ms_to_time_out);
952 +void _x_unlock_frontend(xine_stream_t *stream);
954 void _x_handle_stream_end (xine_stream_t *stream, int non_user);
956 /* report message to UI. usually these are async errors */
957 diff -Nurp ../xine-cvs/xine-lib/src/vdr/Makefile.am xine-lib/src/vdr/Makefile.am
958 --- ../xine-cvs/xine-lib/src/vdr/Makefile.am 1970-01-01 01:00:00.000000000 +0100
959 +++ xine-lib/src/vdr/Makefile.am 2005-06-29 22:58:03.000000000 +0200
961 +include $(top_srcdir)/misc/Makefile.common
965 +libdir = $(XINE_PLUGINDIR)
967 +AM_CFLAGS = -D_LARGEFILE64_SOURCE
970 + xineplug_inp_vdr.la
972 +xineplug_inp_vdr_la_SOURCES = input_vdr.c
973 +xineplug_inp_vdr_la_LIBADD = $(XINE_LIB)
974 +xineplug_inp_vdr_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
976 +include_HEADERS = input_vdr.h
980 +postlibdir = $(XINE_PLUGINDIR)/post
982 +postlib_LTLIBRARIES = \
983 + xineplug_post_vdr.la
985 +xineplug_post_vdr_la_SOURCES = post_vdr.c post_vdr_video.c post_vdr_audio.c
986 +xineplug_post_vdr_la_LIBADD = $(XINE_LIB)
987 +xineplug_post_vdr_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
989 +noinst_HEADERS = post_vdr.h
991 diff -Nurp ../xine-cvs/xine-lib/src/vdr/input_vdr.c xine-lib/src/vdr/input_vdr.c
992 --- ../xine-cvs/xine-lib/src/vdr/input_vdr.c 1970-01-01 01:00:00.000000000 +0100
993 +++ xine-lib/src/vdr/input_vdr.c 2006-03-19 21:37:33.000000000 +0100
996 + * Copyright (C) 2003-2004 the xine project
998 + * This file is part of xine, a free video player.
1000 + * xine is free software; you can redistribute it and/or modify
1001 + * it under the terms of the GNU General Public License as published by
1002 + * the Free Software Foundation; either version 2 of the License, or
1003 + * (at your option) any later version.
1005 + * xine is distributed in the hope that it will be useful,
1006 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1007 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1008 + * GNU General Public License for more details.
1010 + * You should have received a copy of the GNU General Public License
1011 + * along with this program; if not, write to the Free Software
1012 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
1017 +#ifdef HAVE_CONFIG_H
1018 +#include "config.h"
1022 +#include <stdlib.h>
1023 +#include <string.h>
1025 +#include <unistd.h>
1026 +#include <sys/stat.h>
1027 +#include <sys/poll.h>
1029 +#include <pthread.h>
1031 +#define LOG_MODULE "input_vdr"
1032 +#define LOG_VERBOSE
1036 +#include "xine_internal.h"
1037 +#include "xineutils.h"
1038 +#include "input_plugin.h"
1040 +#include "input_vdr.h"
1041 +#include "post_vdr.h"
1045 +#define VDR_MAX_NUM_WINDOWS 16
1046 +#define VDR_ABS_FIFO_DIR "/tmp/vdr-xine"
1050 +#define BUF_SIZE 1024
1054 +#define LOG_OSD(x) x
1060 + input_plugin_t input_plugin;
1062 + xine_stream_t *stream;
1063 + xine_stream_t *stream_external;
1073 + char seek_buf[ BUF_SIZE ];
1076 + off_t preview_size;
1078 + enum funcs cur_func;
1082 + xine_osd_t *osd_window[ VDR_MAX_NUM_WINDOWS ];
1083 + uint8_t *osd_buffer;
1084 + uint32_t osd_buffer_size;
1085 + uint8_t osd_unscaled_blending;
1087 + uint8_t audio_channels;
1088 + uint8_t trick_speed_mode;
1089 + uint8_t mute_mode;
1090 + uint8_t dont_change_xine_volume;
1092 + vdr_frame_size_changed_data_t frame_size;
1094 + pthread_t rpc_thread;
1095 + int rpc_thread_shutdown;
1096 + pthread_mutex_t rpc_thread_shutdown_lock;
1097 + pthread_cond_t rpc_thread_shutdown_cond;
1099 + xine_event_queue_t *event_queue;
1100 + xine_event_queue_t *event_queue_external;
1103 +vdr_input_plugin_t;
1109 + input_class_t input_class;
1117 +static int vdr_write(int f, void *b, int n)
1124 + * System calls are not a thread cancellation point in Linux
1125 + * pthreads. However, the RT signal sent to cancel the thread
1126 + * will cause recv() to return with EINTR, and we can manually
1127 + * check cancellation.
1129 + pthread_testcancel();
1130 + r = write(f, ((char *)b) + t, n - t);
1131 + pthread_testcancel();
1134 + && (errno == EINTR
1135 + || errno == EAGAIN))
1151 +static int internal_write_event_play_external(vdr_input_plugin_t *this, uint32_t key);
1153 +static void event_handler_external(void *user_data, const xine_event_t *event)
1155 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)user_data;
1156 + uint32_t key = key_none;
1158 + printf("event_handler_external(): event->type: %d\n", event->type);
1160 + switch (event->type)
1162 + case XINE_EVENT_UI_PLAYBACK_FINISHED:
1169 + if (0 != internal_write_event_play_external(this, key))
1170 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
1171 + _(LOG_MODULE ": input event write: %s.\n"), strerror(errno));
1174 +static void external_stream_stop(vdr_input_plugin_t *this)
1176 + if (this->stream_external)
1178 + xine_stop(this->stream_external);
1179 + xine_close(this->stream_external);
1181 + if (this->event_queue_external)
1183 + xine_event_dispose_queue(this->event_queue_external);
1184 + this->event_queue_external = 0;
1187 + _x_demux_flush_engine(this->stream_external);
1189 + xine_dispose(this->stream_external);
1190 + this->stream_external = 0;
1194 +static void external_stream_play(vdr_input_plugin_t *this, char *file_name)
1196 + external_stream_stop(this);
1198 + this->stream_external = xine_stream_new(this->stream->xine, this->stream->audio_out, this->stream->video_out);
1200 + this->event_queue_external = xine_event_new_queue(this->stream_external);
1202 + xine_event_create_listener_thread(this->event_queue_external, event_handler_external, this);
1204 + if (!xine_open(this->stream_external, file_name)
1205 + || !xine_play(this->stream_external, 0, 0))
1207 + uint32_t key = key_none;
1209 + if ( 0 != internal_write_event_play_external(this, key))
1210 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
1211 + _(LOG_MODULE ": input event write: %s.\n"), strerror(errno));
1215 +static off_t vdr_read_abort(xine_stream_t *stream, int fd, char *buf, off_t todo)
1222 + * System calls are not a thread cancellation point in Linux
1223 + * pthreads. However, the RT signal sent to cancel the thread
1224 + * will cause recv() to return with EINTR, and we can manually
1225 + * check cancellation.
1227 + pthread_testcancel();
1228 + ret = _x_read_abort(stream, fd, buf, todo);
1229 + pthread_testcancel();
1232 + && (errno == EINTR
1233 + || errno == EAGAIN))
1244 +#define READ_DATA_OR_FAIL(kind, log) \
1245 + data_##kind##_t *data = &data_union.kind; \
1248 + n = vdr_read_abort(this->stream, this->fh_control, (char *)data + sizeof (data->header), sizeof (*data) - sizeof (data->header)); \
1249 + if (n != sizeof (*data) - sizeof (data->header)) \
1252 + this->cur_size -= n; \
1255 +static double _now()
1257 + struct timeval tv;
1259 + gettimeofday(&tv, 0);
1261 + return (tv.tv_sec * 1000000.0 + tv.tv_usec) / 1000.0;
1264 +static off_t vdr_execute_rpc_command(vdr_input_plugin_t *this)
1266 + data_union_t data_union;
1269 + n = vdr_read_abort(this->stream, this->fh_control, (char *)&data_union, sizeof (data_union.header));
1270 + if (n != sizeof (data_union.header))
1273 + this->cur_func = data_union.header.func;
1274 + this->cur_size = data_union.header.len - sizeof (data_union.header);
1275 + this->cur_done = 0;
1277 + switch (this->cur_func)
1281 + READ_DATA_OR_FAIL(nop, lprintf("got NOP\n"));
1285 + case func_osd_new:
1287 + READ_DATA_OR_FAIL(osd_new, LOG_OSD(lprintf("got OSDNEW\n")));
1289 + LOG_OSD(lprintf("... (%d,%d)-(%d,%d)\n", data->x, data->y, data->width, data->height));
1291 + fprintf(stderr, "vdr: osdnew %d\n", data->window);
1293 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1296 + if (0 != this->osd_window[ data->window ])
1299 + this->osd_window[ data->window ] = xine_osd_new(this->stream
1305 + if (0 == this->osd_window[ data->window ])
1310 + case func_osd_free:
1312 + READ_DATA_OR_FAIL(osd_free, LOG_OSD(lprintf("got OSDFREE\n")));
1314 + fprintf(stderr, "vdr: osdfree %d\n", data->window);
1316 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1319 + if (0 != this->osd_window[ data->window ])
1320 + xine_osd_free(this->osd_window[ data->window ]);
1322 + this->osd_window[ data->window ] = 0;
1326 + case func_osd_show:
1328 + READ_DATA_OR_FAIL(osd_show, LOG_OSD(lprintf("got OSDSHOW\n")));
1330 + fprintf(stderr, "vdr: osdshow %d\n", data->window);
1332 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1335 + if (0 != this->osd_window[ data->window ])
1337 + if (this->osd_unscaled_blending)
1338 + xine_osd_show_unscaled(this->osd_window[ data->window ], 0);
1340 + xine_osd_show(this->osd_window[ data->window ], 0);
1345 + case func_osd_hide:
1347 + READ_DATA_OR_FAIL(osd_hide, LOG_OSD(lprintf("got OSDHIDE\n")));
1349 + fprintf(stderr, "vdr: osdhide %d\n", data->window);
1351 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1354 + if (0 != this->osd_window[ data->window ])
1356 + if (this->osd_unscaled_blending)
1357 + xine_osd_show_unscaled(this->osd_window[ data->window ], 0);
1359 + xine_osd_show(this->osd_window[ data->window ], 0);
1364 + case func_osd_flush:
1371 + READ_DATA_OR_FAIL(osd_flush, LOG_OSD(lprintf("got OSDFLUSH\n")));
1373 + fprintf(stderr, "vdr: osdflush +\n");
1377 + while ((r = _x_query_unprocessed_osd_events(this->stream)))
1379 + if ((_now() - _t1) > 200)
1385 + fprintf(stderr, "redraw_needed: 1\n");
1387 +/* sched_yield(); */
1388 + xine_usec_sleep(5000);
1393 + fprintf(stderr, "vdr: osdflush: n: %d, %.1lf, timeout: %d, result: %d\n", _n, _t2 - _t1, _to, r);
1395 + fprintf(stderr, "redraw_needed: 0\n");
1397 + fprintf(stderr, "vdr: osdflush -\n");
1402 + case func_osd_set_position:
1404 + READ_DATA_OR_FAIL(osd_set_position, LOG_OSD(lprintf("got OSDSETPOSITION\n")));
1406 + fprintf(stderr, "vdr: osdsetposition %d\n", data->window);
1408 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1411 + if (0 != this->osd_window[ data->window ])
1412 + xine_osd_set_position(this->osd_window[ data->window ], data->x, data->y);
1416 + case func_osd_draw_bitmap:
1418 + READ_DATA_OR_FAIL(osd_draw_bitmap, LOG_OSD(lprintf("got OSDDRAWBITMAP\n")));
1420 + fprintf(stderr, "vdr: osddrawbitmap %d\n", data->window);
1422 + if (this->osd_buffer_size < this->cur_size)
1424 + if (this->osd_buffer)
1425 + free(this->osd_buffer);
1427 + this->osd_buffer_size = 0;
1429 + this->osd_buffer = xine_xmalloc(this->cur_size);
1430 + if (!this->osd_buffer)
1433 + this->osd_buffer_size = this->cur_size;
1436 + n = vdr_read_abort (this->stream, this->fh_control, (char *)this->osd_buffer, this->cur_size);
1437 + if (n != this->cur_size)
1440 + this->cur_size -= n;
1442 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1445 + if (0 != this->osd_window[ data->window ])
1446 + xine_osd_draw_bitmap(this->osd_window[ data->window ], this->osd_buffer, data->x, data->y, data->width, data->height, 0);
1450 + case func_set_color:
1452 + uint32_t vdr_color[ 256 ];
1454 + READ_DATA_OR_FAIL(set_color, lprintf("got SETCOLOR\n"));
1456 + if (((data->num + 1) * sizeof (uint32_t)) != this->cur_size)
1459 + n = vdr_read_abort (this->stream, this->fh_control, (char *)&vdr_color[ data->index ], this->cur_size);
1460 + if (n != this->cur_size)
1463 + this->cur_size -= n;
1465 + if (data->window >= VDR_MAX_NUM_WINDOWS)
1468 + if (0 != this->osd_window[ data->window ])
1470 + uint32_t color[ 256 ];
1471 + uint8_t trans[ 256 ];
1473 + xine_osd_get_palette(this->osd_window[ data->window ], color, trans);
1478 + for (i = data->index; i <= (data->index + data->num); i++)
1480 + int a = (vdr_color[ i ] & 0xff000000) >> 0x18;
1481 + int r = (vdr_color[ i ] & 0x00ff0000) >> 0x10;
1482 + int g = (vdr_color[ i ] & 0x0000ff00) >> 0x08;
1483 + int b = (vdr_color[ i ] & 0x000000ff) >> 0x00;
1485 + int y = (( 66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
1486 + int cr = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
1487 + int cb = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
1489 + uint8_t *dst = (uint8_t *)&color[ i ];
1495 + trans[ i ] = a >> 4;
1499 + xine_osd_set_palette(this->osd_window[ data->window ], color, trans);
1504 + case func_play_external:
1506 + char file_name[ 1024 ];
1507 + int file_name_len = 0;
1509 + READ_DATA_OR_FAIL(play_external, lprintf("got PLAYEXTERNAL\n"));
1511 + file_name_len = this->cur_size;
1513 + if (0 != file_name_len)
1515 + if (file_name_len <= 1
1516 + || file_name_len > sizeof (file_name))
1521 + n = vdr_read_abort (this->stream, this->fh_control, file_name, file_name_len);
1522 + if (n != file_name_len)
1525 + if (file_name[ file_name_len - 1 ] != '\0')
1528 + this->cur_size -= n;
1531 + lprintf((file_name_len > 0) ? "----------- play external: %s\n" : "---------- stop external\n", file_name);
1533 + if (file_name_len > 0)
1534 + external_stream_play(this, file_name);
1536 + external_stream_stop(this);
1542 + READ_DATA_OR_FAIL(clear, lprintf("got CLEAR\n"));
1545 + int orig_speed = xine_get_param(this->stream, XINE_PARAM_FINE_SPEED);
1546 + if (orig_speed <= 0)
1547 + xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, XINE_FINE_SPEED_NORMAL);
1548 +fprintf(stderr, "+++ CLEAR(%d%c)\n", data->n, data->s ? 'b' : 'a');
1550 + if (!this->dont_change_xine_volume)
1551 + xine_set_param(this->stream, XINE_PARAM_AUDIO_VOLUME, 0);
1553 + _x_demux_flush_engine(this->stream);
1554 +fprintf(stderr, "=== CLEAR(%d.1)\n", data->n);
1555 + _x_demux_control_start(this->stream);
1556 +fprintf(stderr, "=== CLEAR(%d.2)\n", data->n);
1557 + _x_demux_seek(this->stream, 0, 0, 0);
1558 +fprintf(stderr, "=== CLEAR(%d.3)\n", data->n);
1560 + _x_stream_info_reset(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE);
1561 +fprintf(stderr, "=== CLEAR(%d.4)\n", data->n);
1562 + _x_meta_info_reset(this->stream, XINE_META_INFO_AUDIOCODEC);
1563 +fprintf(stderr, "=== CLEAR(%d.5)\n", data->n);
1565 + _x_trigger_relaxed_frame_drop_mode(this->stream);
1566 +/* _x_reset_relaxed_frame_drop_mode(this->stream); */
1568 + if (!this->dont_change_xine_volume)
1569 + xine_set_param(this->stream, XINE_PARAM_AUDIO_VOLUME, this->last_volume);
1571 +fprintf(stderr, "--- CLEAR(%d%c)\n", data->n, data->s ? 'b' : 'a');
1572 + if (orig_speed <= 0)
1573 + xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, orig_speed);
1578 + case func_first_frame:
1580 + READ_DATA_OR_FAIL(first_frame, lprintf("got FIRST FRAME\n"));
1582 + _x_trigger_relaxed_frame_drop_mode(this->stream);
1583 +/* _x_reset_relaxed_frame_drop_mode(this->stream); */
1587 + case func_still_frame:
1589 + READ_DATA_OR_FAIL(still_frame, lprintf("got STILL FRAME\n"));
1591 + _x_reset_relaxed_frame_drop_mode(this->stream);
1595 + case func_set_video_window:
1597 + READ_DATA_OR_FAIL(set_video_window, lprintf("got SET VIDEO WINDOW\n"));
1599 + fprintf(stderr, "svw: (%d, %d)x(%d, %d), (%d, %d)\n", data->x, data->y, data->w, data->h, data->wRef, data->hRef);
1602 + xine_event_t event;
1603 + vdr_set_video_window_data_t event_data;
1605 + event_data.x = data->x;
1606 + event_data.y = data->y;
1607 + event_data.w = data->w;
1608 + event_data.h = data->h;
1609 + event_data.w_ref = data->w_ref;
1610 + event_data.h_ref = data->h_ref;
1612 + event.type = XINE_EVENT_VDR_SETVIDEOWINDOW;
1613 + event.data = &event_data;
1614 + event.data_length = sizeof (event_data);
1616 + xine_event_send(this->stream, &event);
1621 + case func_select_audio:
1623 + READ_DATA_OR_FAIL(select_audio, lprintf("got SELECT AUDIO\n"));
1625 + this->audio_channels = data->channels;
1628 + xine_event_t event;
1629 + vdr_select_audio_data_t event_data;
1631 + event_data.channels = this->audio_channels;
1633 + event.type = XINE_EVENT_VDR_SELECTAUDIO;
1634 + event.data = &event_data;
1635 + event.data_length = sizeof (event_data);
1637 + xine_event_send(this->stream, &event);
1642 + case func_trick_speed_mode:
1644 + READ_DATA_OR_FAIL(trick_speed_mode, lprintf("got TRICK SPEED MODE\n"));
1646 + this->trick_speed_mode = data->on;
1648 + _x_demux_seek(this->stream, 0, 0, 0);
1651 + xine_event_t event;
1653 + event.type = XINE_EVENT_VDR_TRICKSPEEDMODE;
1655 + event.data_length = this->trick_speed_mode;
1656 +/* fprintf(stderr, "************************: %p, %d\n", event.data, event.data_length); */
1657 + xine_event_send(this->stream, &event);
1664 + READ_DATA_OR_FAIL(flush, lprintf("got FLUSH\n"));
1666 + if (!data->just_wait)
1668 + if (this->stream->video_fifo)
1670 + buf_element_t *buf = this->stream->video_fifo->buffer_pool_alloc(this->stream->video_fifo);
1673 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": buffer_pool_alloc() failed!\n"));
1677 + buf->type = BUF_CONTROL_FLUSH_DECODER;
1679 + this->stream->video_fifo->put(this->stream->video_fifo, buf);
1687 + int vb = -1, ab = -1, vf = -1, af = -1;
1689 + uint8_t timed_out = 0;
1691 + struct timeval now, then;
1693 + if (data->ms_timeout >= 0)
1695 + gettimeofday(&now, 0);
1698 + then.tv_usec += (data->ms_timeout % 1000) * 1000;
1699 + then.tv_sec += (data->ms_timeout / 1000);
1701 + if (then.tv_usec >= 1000000)
1703 + then.tv_usec -= 1000000;
1717 + _x_query_buffer_usage(this->stream, &vb, &ab, &vf, &af);
1719 + if (vb <= 0 && ab <= 0 && vf <= 0 && af <= 0)
1722 + if (data->ms_timeout >= 0
1723 + && timercmp(&now, &then, >=))
1729 +/* sched_yield(); */
1730 + xine_usec_sleep(5000);
1733 + if (data->ms_timeout >= 0)
1734 + gettimeofday(&now, 0);
1738 + fprintf(stderr, "vdr: flush: n: %d, %.1lf\n", _n, _t2 - _t1);
1740 + xprintf(this->stream->xine
1741 + , XINE_VERBOSITY_LOG
1742 + , _(LOG_MODULE ": flush buffers (vb: %d, ab: %d, vf: %d, af: %d) %s.\n")
1744 + , (timed_out ? "timed out" : "done"));
1747 + result_flush_t result_flush;
1748 + result_flush.header.func = data->header.func;
1749 + result_flush.header.len = sizeof (result_flush);
1751 + result_flush.timed_out = timed_out;
1753 + if (sizeof (result_flush) != vdr_write(this->fh_result, &result_flush, sizeof (result_flush)))
1762 + READ_DATA_OR_FAIL(mute, lprintf("got MUTE\n"));
1764 + xine_set_param(this->stream, XINE_PARAM_AUDIO_MUTE, data->mute);
1768 + case func_set_volume:
1770 + READ_DATA_OR_FAIL(set_volume, lprintf("got SETVOLUME\n"));
1773 + int change_volume = !this->dont_change_xine_volume;
1774 + int do_mute = (0 != this->last_volume && 0 == data->volume);
1775 + int do_unmute = (0 == this->last_volume && 0 != data->volume);
1776 + int report_change = 0;
1778 + this->last_volume = data->volume;
1780 + if (do_mute || do_unmute)
1782 + switch (this->mute_mode)
1784 + case INPUT_VDR_MUTE_EXECUTE:
1785 + report_change = 1;
1786 + xine_set_param(this->stream, XINE_PARAM_AUDIO_MUTE, do_mute);
1788 + case INPUT_VDR_MUTE_IGNORE:
1790 + change_volume = 0;
1793 + case INPUT_VDR_MUTE_SIMULATE:
1794 + change_volume = 1;
1802 + if (change_volume)
1804 + report_change = 1;
1805 + xine_set_param(this->stream, XINE_PARAM_AUDIO_VOLUME, this->last_volume);
1808 + if (report_change)
1810 + xine_event_t event;
1811 + xine_audio_level_data_t data;
1815 + = xine_get_param(this->stream, XINE_PARAM_AUDIO_VOLUME);
1817 + = xine_get_param(this->stream, XINE_PARAM_AUDIO_MUTE);
1819 + event.type = XINE_EVENT_AUDIO_LEVEL;
1820 + event.data = &data;
1821 + event.data_length = sizeof (data);
1823 + xine_event_send(this->stream, &event);
1829 + case func_set_speed:
1831 + READ_DATA_OR_FAIL(set_speed, lprintf("got SETSPEED\n"));
1833 + lprintf("... got SETSPEED %d\n", data->speed);
1835 + if (data->speed != xine_get_param(this->stream, XINE_PARAM_FINE_SPEED))
1836 + xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, data->speed);
1840 + case func_set_prebuffer:
1842 + READ_DATA_OR_FAIL(set_prebuffer, lprintf("got SETPREBUFFER\n"));
1844 + xine_set_param(this->stream, XINE_PARAM_METRONOM_PREBUFFER, data->prebuffer);
1848 + case func_metronom:
1850 + READ_DATA_OR_FAIL(metronom, lprintf("got METRONOM\n"));
1852 + _x_demux_control_newpts(this->stream, data->pts, data->flags);
1858 + READ_DATA_OR_FAIL(start, lprintf("got START\n"));
1860 + _x_demux_control_start(this->stream);
1861 + _x_demux_seek(this->stream, 0, 0, 0);
1867 + READ_DATA_OR_FAIL(wait, lprintf("got WAIT\n"));
1870 + result_wait_t result_wait;
1871 + result_wait.header.func = data->header.func;
1872 + result_wait.header.len = sizeof (result_wait);
1874 + if (sizeof (result_wait) != vdr_write(this->fh_result, &result_wait, sizeof (result_wait)))
1882 + READ_DATA_OR_FAIL(setup, lprintf("got SETUP\n"));
1884 + this->osd_unscaled_blending = data->osd_unscaled_blending;
1885 + this->dont_change_xine_volume = data->dont_change_xine_volume;
1886 + this->mute_mode = data->mute_mode;
1890 + case func_grab_image:
1892 + READ_DATA_OR_FAIL(grab_image, lprintf("got GRABIMAGE\n"));
1895 + off_t ret_val = -1;
1898 + int frame_size = 0;
1901 + int ratio_code = 0;
1904 + int orig_speed = xine_get_param(this->stream, XINE_PARAM_FINE_SPEED);
1905 + if (XINE_SPEED_PAUSE != orig_speed)
1906 + xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, XINE_SPEED_PAUSE);
1908 + if (xine_get_current_frame(this->stream, &width, &height, &ratio_code, &format, 0))
1912 + case XINE_IMGFMT_YV12:
1913 + frame_size = width * height
1914 + + ((width + 1) / 2) * ((height + 1) / 2)
1915 + + ((width + 1) / 2) * ((height + 1) / 2);
1918 + case XINE_IMGFMT_YUY2:
1919 + frame_size = width * height
1920 + + ((width + 1) / 2) * height
1921 + + ((width + 1) / 2) * height;
1925 + img = xine_xmalloc(frame_size);
1927 + if (!xine_get_current_frame(this->stream, &width, &height, &ratio_code, &format, img))
1930 + if (ratio_code == XINE_VO_ASPECT_SQUARE)
1931 + ratio_code = 10000;
1932 + else if (ratio_code == XINE_VO_ASPECT_4_3)
1933 + ratio_code = 13333;
1934 + else if (ratio_code == XINE_VO_ASPECT_ANAMORPHIC)
1935 + ratio_code = 17778;
1936 + else if (ratio_code == XINE_VO_ASPECT_DVB)
1937 + ratio_code = 21100;
1939 + if (0 == frame_size)
1947 + if (XINE_SPEED_PAUSE != orig_speed)
1948 + xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, orig_speed);
1951 + result_grab_image_t result_grab_image;
1952 + result_grab_image.header.func = data->header.func;
1953 + result_grab_image.header.len = sizeof (result_grab_image) + frame_size;
1955 + result_grab_image.width = width;
1956 + result_grab_image.height = height;
1957 + result_grab_image.ratio = ratio_code;
1958 + result_grab_image.format = format;
1960 + if (sizeof (result_grab_image) == vdr_write(this->fh_result, &result_grab_image, sizeof (result_grab_image)))
1962 + if (frame_size == vdr_write(this->fh_result, img, frame_size))
1976 + case func_get_pts:
1978 + READ_DATA_OR_FAIL(get_pts, lprintf("got GETPTS\n"));
1981 + result_get_pts_t result_get_pts;
1982 + result_get_pts.header.func = data->header.func;
1983 + result_get_pts.header.len = sizeof (result_get_pts);
1985 + result_get_pts.pts = xine_get_current_vpts(this->stream) - this->stream->metronom->get_option(this->stream->metronom, METRONOM_VPTS_OFFSET);
1987 + if (sizeof (result_get_pts) != vdr_write(this->fh_result, &result_get_pts, sizeof (result_get_pts)))
1993 + case func_get_version:
1995 + READ_DATA_OR_FAIL(get_version, lprintf("got GETVERSION\n"));
1998 + result_get_version_t result_get_version;
1999 + result_get_version.header.func = data->header.func;
2000 + result_get_version.header.len = sizeof (result_get_version);
2002 + result_get_version.version = XINE_INPUT_VDR_VERSION;
2004 + if (sizeof (result_get_version) != vdr_write(this->fh_result, &result_get_version, sizeof (result_get_version)))
2010 + case func_video_size:
2012 + READ_DATA_OR_FAIL(video_size, lprintf("got VIDEO SIZE\n"));
2017 + result_video_size_t result_video_size;
2018 + result_video_size.header.func = data->header.func;
2019 + result_video_size.header.len = sizeof (result_video_size);
2021 + result_video_size.top = -1;
2022 + result_video_size.left = -1;
2023 + result_video_size.width = -1;
2024 + result_video_size.height = -1;
2025 + result_video_size.ratio = 0;
2027 + xine_get_current_frame(this->stream, &result_video_size.width, &result_video_size.height, &result_video_size.ratio, &format, 0);
2029 + if (result_video_size.ratio == XINE_VO_ASPECT_SQUARE)
2030 + result_video_size.ratio = 10000;
2031 + else if (result_video_size.ratio == XINE_VO_ASPECT_4_3)
2032 + result_video_size.ratio = 13333;
2033 + else if (result_video_size.ratio == XINE_VO_ASPECT_ANAMORPHIC)
2034 + result_video_size.ratio = 17778;
2035 + else if (result_video_size.ratio == XINE_VO_ASPECT_DVB)
2036 + result_video_size.ratio = 21100;
2038 + if (0 != this->frame_size.x
2039 + || 0 != this->frame_size.y
2040 + || 0 != this->frame_size.w
2041 + || 0 != this->frame_size.h)
2043 + result_video_size.left = this->frame_size.x;
2044 + result_video_size.top = this->frame_size.y;
2045 + result_video_size.width = this->frame_size.w;
2046 + result_video_size.height = this->frame_size.h;
2049 + result_video_size.zoom_x = xine_get_param(this->stream, XINE_PARAM_VO_ZOOM_X);
2050 + result_video_size.zoom_y = xine_get_param(this->stream, XINE_PARAM_VO_ZOOM_Y);
2052 + if (sizeof (result_video_size) != vdr_write(this->fh_result, &result_video_size, sizeof (result_video_size)))
2058 + case func_reset_audio:
2063 + READ_DATA_OR_FAIL(reset_audio, lprintf("got RESET AUDIO\n"));
2065 + if (this->stream->audio_fifo)
2067 + xine_set_param(this->stream, XINE_PARAM_IGNORE_AUDIO, 1);
2068 + xine_set_param(this->stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, -2);
2074 + int n = xine_get_stream_info(this->stream, XINE_STREAM_INFO_MAX_AUDIO_CHANNEL);
2078 + /* keep the decoder running */
2079 + if (this->stream->audio_fifo)
2081 + buf_element_t *buf = this->stream->audio_fifo->buffer_pool_alloc(this->stream->audio_fifo);
2084 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": buffer_pool_alloc() failed!\n"));
2088 + buf->type = BUF_CONTROL_RESET_TRACK_MAP;
2090 + this->stream->audio_fifo->put(this->stream->audio_fifo, buf);
2093 +/* sched_yield(); */
2094 + xine_usec_sleep(5000);
2099 + fprintf(stderr, "vdr: reset_audio: n: %d, %.1lf\n", _n, _t2 - _t1);
2101 + xine_set_param(this->stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, -1);
2103 + _x_stream_info_reset(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE);
2104 + _x_meta_info_reset(this->stream, XINE_META_INFO_AUDIOCODEC);
2106 + xine_set_param(this->stream, XINE_PARAM_IGNORE_AUDIO, 0);
2112 + lprintf("unknown function: %d\n", this->cur_func);
2115 + if (this->cur_size != this->cur_done)
2117 + off_t skip = this->cur_size - this->cur_done;
2119 + lprintf("func: %d, skipping: %lld\n", this->cur_func, skip);
2121 + while (skip > BUF_SIZE)
2123 + n = vdr_read_abort(this->stream, this->fh_control, this->seek_buf, BUF_SIZE);
2124 + if (n != BUF_SIZE)
2130 + n = vdr_read_abort(this->stream, this->fh_control, this->seek_buf, skip);
2134 + this->cur_done = this->cur_size;
2142 +static void *vdr_rpc_thread_loop(void *arg)
2144 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)arg;
2145 + int frontend_lock_failures = 0;
2149 + && !this->rpc_thread_shutdown)
2151 + struct timeval timeout;
2155 + FD_SET(this->fh_control, &rset);
2157 + timeout.tv_sec = 0;
2158 + timeout.tv_usec = 50000;
2160 + if (select(this->fh_control + 1, &rset, NULL, NULL, &timeout) > 0)
2162 + if (!_x_lock_frontend(this->stream, 100))
2164 + if (++frontend_lock_failures > 50)
2167 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
2168 + LOG_MODULE ": locking frontend for rpc command execution failed, exiting ...\n");
2173 + frontend_lock_failures = 0;
2175 + if (vdr_execute_rpc_command(this) < 0)
2178 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
2179 + LOG_MODULE ": execution of rpc command %d (%s) failed, exiting ...\n", this->cur_func, "");
2182 + _x_unlock_frontend(this->stream);
2187 + /* close control and result channel here to have vdr-xine initiate a disconnect for the above error case ... */
2188 + close(this->fh_control);
2189 + this->fh_control = -1;
2191 + close(this->fh_result);
2192 + this->fh_result = -1;
2194 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
2195 + LOG_MODULE ": rpc thread done.\n");
2197 + pthread_mutex_lock(&this->rpc_thread_shutdown_lock);
2198 + this->rpc_thread_shutdown = -1;
2199 + pthread_cond_broadcast(&this->rpc_thread_shutdown_cond);
2200 + pthread_mutex_unlock(&this->rpc_thread_shutdown_lock);
2205 +static int internal_write_event_key(vdr_input_plugin_t *this, uint32_t key)
2207 + event_key_t event;
2208 + event.header.func = func_key;
2209 + event.header.len = sizeof (event);
2213 + if (sizeof (event) != vdr_write(this->fh_event, &event, sizeof (event)))
2219 +static int internal_write_event_frame_size(vdr_input_plugin_t *this)
2221 + event_frame_size_t event;
2222 + event.header.func = func_frame_size;
2223 + event.header.len = sizeof (event);
2225 + event.left = this->frame_size.x;
2226 + event.top = this->frame_size.y;
2227 + event.width = this->frame_size.w,
2228 + event.height = this->frame_size.h;
2229 + event.zoom_x = xine_get_param(this->stream, XINE_PARAM_VO_ZOOM_X);
2230 + event.zoom_y = xine_get_param(this->stream, XINE_PARAM_VO_ZOOM_Y);
2232 + if (sizeof (event) != vdr_write(this->fh_event, &event, sizeof (event)))
2238 +static int internal_write_event_play_external(vdr_input_plugin_t *this, uint32_t key)
2240 + event_play_external_t event;
2241 + event.header.func = func_play_external;
2242 + event.header.len = sizeof (event);
2246 + if (sizeof (event) != vdr_write(this->fh_event, &event, sizeof (event)))
2252 +static off_t vdr_plugin_read(input_plugin_t *this_gen,
2253 + char *buf, off_t len)
2255 + vdr_input_plugin_t *this = (vdr_input_plugin_t *) this_gen;
2258 + lprintf ("reading %lld bytes...\n", len);
2261 + if (this->curpos < this->preview_size)
2263 + n = this->preview_size - this->curpos;
2264 + if (n > (len - total))
2267 + lprintf ("%lld bytes from preview (which has %lld bytes)\n",
2268 + n, this->preview_size);
2270 + memcpy (&buf[total], &this->preview[this->curpos], n);
2271 + this->curpos += n;
2275 + if( (len-total) > 0 )
2280 + n = vdr_read_abort (this->stream, this->fh, &buf[total], len-total);
2282 + lprintf("read 0, retries: %d\n", retries);
2285 + && !this->stream_external
2286 + && _x_continue_stream_processing(this->stream)
2287 + && 200 > retries++); /* 200 * 50ms */
2289 + lprintf ("got %lld bytes (%lld/%lld bytes read)\n",
2294 + _x_message(this->stream, XINE_MSG_READ_ERROR, NULL);
2298 + this->curpos += n;
2304 +static buf_element_t *vdr_plugin_read_block(input_plugin_t *this_gen, fifo_buffer_t *fifo,
2307 + off_t total_bytes;
2308 + buf_element_t *buf = fifo->buffer_pool_alloc(fifo);
2310 + buf->content = buf->mem;
2311 + buf->type = BUF_DEMUX_BLOCK;
2313 + total_bytes = vdr_plugin_read(this_gen, (char *)buf->content, todo);
2315 + if (total_bytes != todo)
2317 + buf->free_buffer(buf);
2321 + buf->size = total_bytes;
2326 +/* forward reference */
2327 +static off_t vdr_plugin_get_current_pos(input_plugin_t *this_gen);
2329 +static off_t vdr_plugin_seek(input_plugin_t *this_gen, off_t offset, int origin)
2331 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen;
2333 + lprintf("seek %lld offset, %d origin...\n",
2336 + if ((origin == SEEK_CUR) && (offset >= 0))
2338 + for ( ; ((int)offset) - BUF_SIZE > 0; offset -= BUF_SIZE)
2340 + if (!this_gen->read(this_gen, this->seek_buf, BUF_SIZE))
2341 + return this->curpos;
2344 + this_gen->read (this_gen, this->seek_buf, offset);
2347 + if (origin == SEEK_SET)
2349 + if (offset < this->curpos)
2351 + if (this->curpos <= this->preview_size)
2352 + this->curpos = offset;
2354 + lprintf("cannot seek back! (%lld > %lld)\n", this->curpos, offset);
2358 + offset -= this->curpos;
2360 + for ( ; ((int)offset) - BUF_SIZE > 0; offset -= BUF_SIZE)
2362 + if (!this_gen->read(this_gen, this->seek_buf, BUF_SIZE))
2363 + return this->curpos;
2366 + this_gen->read(this_gen, this->seek_buf, offset);
2370 + return this->curpos;
2373 +static off_t vdr_plugin_get_length(input_plugin_t *this_gen)
2378 +static uint32_t vdr_plugin_get_capabilities(input_plugin_t *this_gen)
2380 + return INPUT_CAP_NOCAP; /* INPUT_CAP_PREVIEW; */
2383 +static uint32_t vdr_plugin_get_blocksize(input_plugin_t *this_gen)
2388 +static off_t vdr_plugin_get_current_pos(input_plugin_t *this_gen)
2390 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen;
2392 + return this->curpos;
2395 +static char* vdr_plugin_get_mrl(input_plugin_t *this_gen)
2397 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen;
2402 +static void vdr_plugin_dispose(input_plugin_t *this_gen)
2404 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen;
2407 + external_stream_stop(this);
2409 + if (this->event_queue)
2410 + xine_event_dispose_queue(this->event_queue);
2412 + if (this->rpc_thread)
2414 + struct timespec abstime;
2415 + int ms_to_time_out = 10000;
2417 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": shutting down rpc thread (timeout: %d ms) ...\n"), ms_to_time_out);
2419 + pthread_mutex_lock(&this->rpc_thread_shutdown_lock);
2421 + if (this->rpc_thread_shutdown > -1)
2423 + this->rpc_thread_shutdown = 1;
2426 + struct timeval now;
2427 + gettimeofday(&now, 0);
2429 + abstime.tv_sec = now.tv_sec + ms_to_time_out / 1000;
2430 + abstime.tv_nsec = now.tv_usec * 1000 + (ms_to_time_out % 1000) * 1e6;
2432 + if (abstime.tv_nsec > 1e9)
2434 + abstime.tv_nsec -= 1e9;
2439 + if (0 != pthread_cond_timedwait(&this->rpc_thread_shutdown_cond, &this->rpc_thread_shutdown_lock, &abstime))
2441 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": cancelling rpc thread in function %d...\n"), this->cur_func);
2442 + pthread_cancel(this->rpc_thread);
2446 + pthread_mutex_unlock(&this->rpc_thread_shutdown_lock);
2448 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": joining rpc thread ...\n"));
2449 + pthread_join(this->rpc_thread, 0);
2450 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": rpc thread joined.\n"));
2453 + pthread_cond_destroy(&this->rpc_thread_shutdown_cond);
2454 + pthread_mutex_destroy(&this->rpc_thread_shutdown_lock);
2456 + if (this->fh_result != -1)
2457 + close(this->fh_result);
2459 + if (this->fh_control != -1)
2460 + close(this->fh_control);
2462 + if (this->fh_event != -1)
2463 + close(this->fh_event);
2465 + for (i = 0; i < VDR_MAX_NUM_WINDOWS; i++)
2467 + if (0 == this->osd_window[ i ])
2470 + xine_osd_hide(this->osd_window[ i ], 0);
2471 + xine_osd_free(this->osd_window[ i ]);
2474 + if (this->osd_buffer)
2475 + free(this->osd_buffer);
2477 + if ((this->fh != STDIN_FILENO) && (this->fh != -1))
2484 +static int vdr_plugin_get_optional_data(input_plugin_t *this_gen,
2485 + void *data, int data_type)
2487 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen;
2488 + int preview_size = (this->preview_size > MAX_PREVIEW_SIZE) ? MAX_PREVIEW_SIZE : this->preview_size;
2490 + switch (data_type)
2492 + case INPUT_OPTIONAL_DATA_PREVIEW:
2493 + memcpy (data, this->preview, preview_size);
2494 + return preview_size;
2497 + return INPUT_OPTIONAL_UNSUPPORTED;
2500 +static uint8_t preview_mpg_data[] =
2502 +/* 0x0000 */ 0x00, 0x00, 0x01, 0xb3, 0x2d, 0x02, 0x40, 0x23, 0x12, 0x4f, 0xa3, 0x80, 0x00, 0x00, 0x01, 0xb5,
2503 +/* 0x0010 */ 0x14, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb5, 0x23, 0x05, 0x05, 0x05, 0x0b, 0x42,
2504 +/* 0x0020 */ 0x12, 0x00, 0x00, 0x00, 0x01, 0xb8, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
2505 +/* 0x0030 */ 0xff, 0xf8, 0x00, 0x00, 0x01, 0xb5, 0x8f, 0xff, 0xf7, 0xdd, 0x80, 0x00, 0x00, 0x01, 0x01, 0x0b,
2506 +/* 0x0040 */ 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2507 +/* 0x0050 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2508 +/* 0x0060 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2509 +/* 0x0070 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2510 +/* 0x0080 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2511 +/* 0x0090 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2512 +/* 0x00a0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2513 +/* 0x00b0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2514 +/* 0x00c0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2515 +/* 0x00d0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2516 +/* 0x00e0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2517 +/* 0x00f0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2518 +/* 0x0100 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2519 +/* 0x0110 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2520 +/* 0x0120 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00,
2521 +/* 0x0130 */ 0x01, 0x02, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2522 +/* 0x0140 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2523 +/* 0x0150 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2524 +/* 0x0160 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2525 +/* 0x0170 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2526 +/* 0x0180 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2527 +/* 0x0190 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2528 +/* 0x01a0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2529 +/* 0x01b0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2530 +/* 0x01c0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2531 +/* 0x01d0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2532 +/* 0x01e0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2533 +/* 0x01f0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2534 +/* 0x0200 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2535 +/* 0x0210 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2536 +/* 0x0220 */ 0x60, 0x00, 0x00, 0x01, 0x03, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2537 +/* 0x0230 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2538 +/* 0x0240 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2539 +/* 0x0250 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2540 +/* 0x0260 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2541 +/* 0x0270 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2542 +/* 0x0280 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2543 +/* 0x0290 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2544 +/* 0x02a0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2545 +/* 0x02b0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2546 +/* 0x02c0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2547 +/* 0x02d0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2548 +/* 0x02e0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2549 +/* 0x02f0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2550 +/* 0x0300 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2551 +/* 0x0310 */ 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x04, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2552 +/* 0x0320 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2553 +/* 0x0330 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2554 +/* 0x0340 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2555 +/* 0x0350 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2556 +/* 0x0360 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2557 +/* 0x0370 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2558 +/* 0x0380 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2559 +/* 0x0390 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2560 +/* 0x03a0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2561 +/* 0x03b0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2562 +/* 0x03c0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2563 +/* 0x03d0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2564 +/* 0x03e0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2565 +/* 0x03f0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2566 +/* 0x0400 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x05, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3,
2567 +/* 0x0410 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2568 +/* 0x0420 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2569 +/* 0x0430 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2570 +/* 0x0440 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2571 +/* 0x0450 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2572 +/* 0x0460 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2573 +/* 0x0470 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2574 +/* 0x0480 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2575 +/* 0x0490 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2576 +/* 0x04a0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2577 +/* 0x04b0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2578 +/* 0x04c0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2579 +/* 0x04d0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2580 +/* 0x04e0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2581 +/* 0x04f0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x06, 0x0b, 0xfc,
2582 +/* 0x0500 */ 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2583 +/* 0x0510 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2584 +/* 0x0520 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2585 +/* 0x0530 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2586 +/* 0x0540 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2587 +/* 0x0550 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2588 +/* 0x0560 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2589 +/* 0x0570 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2590 +/* 0x0580 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2591 +/* 0x0590 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2592 +/* 0x05a0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2593 +/* 0x05b0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2594 +/* 0x05c0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2595 +/* 0x05d0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2596 +/* 0x05e0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01,
2597 +/* 0x05f0 */ 0x07, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2598 +/* 0x0600 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2599 +/* 0x0610 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2600 +/* 0x0620 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2601 +/* 0x0630 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2602 +/* 0x0640 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2603 +/* 0x0650 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2604 +/* 0x0660 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2605 +/* 0x0670 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2606 +/* 0x0680 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2607 +/* 0x0690 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2608 +/* 0x06a0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2609 +/* 0x06b0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2610 +/* 0x06c0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2611 +/* 0x06d0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60,
2612 +/* 0x06e0 */ 0x00, 0x00, 0x01, 0x08, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2613 +/* 0x06f0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2614 +/* 0x0700 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2615 +/* 0x0710 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2616 +/* 0x0720 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2617 +/* 0x0730 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2618 +/* 0x0740 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2619 +/* 0x0750 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2620 +/* 0x0760 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2621 +/* 0x0770 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2622 +/* 0x0780 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2623 +/* 0x0790 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2624 +/* 0x07a0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2625 +/* 0x07b0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2626 +/* 0x07c0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2627 +/* 0x07d0 */ 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x09, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2628 +/* 0x07e0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2629 +/* 0x07f0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2630 +/* 0x0800 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2631 +/* 0x0810 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2632 +/* 0x0820 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2633 +/* 0x0830 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2634 +/* 0x0840 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2635 +/* 0x0850 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2636 +/* 0x0860 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2637 +/* 0x0870 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2638 +/* 0x0880 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2639 +/* 0x0890 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2640 +/* 0x08a0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2641 +/* 0x08b0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2642 +/* 0x08c0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x0a, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46,
2643 +/* 0x08d0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2644 +/* 0x08e0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2645 +/* 0x08f0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2646 +/* 0x0900 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2647 +/* 0x0910 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2648 +/* 0x0920 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2649 +/* 0x0930 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2650 +/* 0x0940 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2651 +/* 0x0950 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2652 +/* 0x0960 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2653 +/* 0x0970 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2654 +/* 0x0980 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2655 +/* 0x0990 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2656 +/* 0x09a0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2657 +/* 0x09b0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x0b, 0x0b, 0xfc, 0x3e,
2658 +/* 0x09c0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2659 +/* 0x09d0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2660 +/* 0x09e0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2661 +/* 0x09f0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2662 +/* 0x0a00 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2663 +/* 0x0a10 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2664 +/* 0x0a20 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2665 +/* 0x0a30 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2666 +/* 0x0a40 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2667 +/* 0x0a50 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2668 +/* 0x0a60 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2669 +/* 0x0a70 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2670 +/* 0x0a80 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2671 +/* 0x0a90 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2672 +/* 0x0aa0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x0c,
2673 +/* 0x0ab0 */ 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2674 +/* 0x0ac0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2675 +/* 0x0ad0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2676 +/* 0x0ae0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2677 +/* 0x0af0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2678 +/* 0x0b00 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2679 +/* 0x0b10 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2680 +/* 0x0b20 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2681 +/* 0x0b30 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2682 +/* 0x0b40 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2683 +/* 0x0b50 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2684 +/* 0x0b60 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2685 +/* 0x0b70 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2686 +/* 0x0b80 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2687 +/* 0x0b90 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00,
2688 +/* 0x0ba0 */ 0x00, 0x01, 0x0d, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2689 +/* 0x0bb0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2690 +/* 0x0bc0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2691 +/* 0x0bd0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2692 +/* 0x0be0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2693 +/* 0x0bf0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2694 +/* 0x0c00 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2695 +/* 0x0c10 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2696 +/* 0x0c20 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2697 +/* 0x0c30 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2698 +/* 0x0c40 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2699 +/* 0x0c50 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2700 +/* 0x0c60 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2701 +/* 0x0c70 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2702 +/* 0x0c80 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2703 +/* 0x0c90 */ 0x18, 0x60, 0x00, 0x00, 0x01, 0x0e, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2704 +/* 0x0ca0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2705 +/* 0x0cb0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2706 +/* 0x0cc0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2707 +/* 0x0cd0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2708 +/* 0x0ce0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2709 +/* 0x0cf0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2710 +/* 0x0d00 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2711 +/* 0x0d10 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2712 +/* 0x0d20 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2713 +/* 0x0d30 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2714 +/* 0x0d40 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2715 +/* 0x0d50 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2716 +/* 0x0d60 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2717 +/* 0x0d70 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2718 +/* 0x0d80 */ 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x0f, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18,
2719 +/* 0x0d90 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2720 +/* 0x0da0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2721 +/* 0x0db0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2722 +/* 0x0dc0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2723 +/* 0x0dd0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2724 +/* 0x0de0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2725 +/* 0x0df0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2726 +/* 0x0e00 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2727 +/* 0x0e10 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2728 +/* 0x0e20 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2729 +/* 0x0e30 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2730 +/* 0x0e40 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2731 +/* 0x0e50 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2732 +/* 0x0e60 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2733 +/* 0x0e70 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x10, 0x0b, 0xfc, 0x3e, 0xd1,
2734 +/* 0x0e80 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2735 +/* 0x0e90 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2736 +/* 0x0ea0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2737 +/* 0x0eb0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2738 +/* 0x0ec0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2739 +/* 0x0ed0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2740 +/* 0x0ee0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2741 +/* 0x0ef0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2742 +/* 0x0f00 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2743 +/* 0x0f10 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2744 +/* 0x0f20 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2745 +/* 0x0f30 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2746 +/* 0x0f40 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2747 +/* 0x0f50 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2748 +/* 0x0f60 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x11, 0x0b,
2749 +/* 0x0f70 */ 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2750 +/* 0x0f80 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2751 +/* 0x0f90 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2752 +/* 0x0fa0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2753 +/* 0x0fb0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2754 +/* 0x0fc0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2755 +/* 0x0fd0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2756 +/* 0x0fe0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2757 +/* 0x0ff0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2758 +/* 0x1000 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2759 +/* 0x1010 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2760 +/* 0x1020 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2761 +/* 0x1030 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2762 +/* 0x1040 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2763 +/* 0x1050 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00,
2764 +/* 0x1060 */ 0x01, 0x12, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2765 +/* 0x1070 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2766 +/* 0x1080 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2767 +/* 0x1090 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2768 +/* 0x10a0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2769 +/* 0x10b0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2770 +/* 0x10c0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2771 +/* 0x10d0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2772 +/* 0x10e0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2773 +/* 0x10f0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2774 +/* 0x1100 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2775 +/* 0x1110 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2776 +/* 0x1120 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2777 +/* 0x1130 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2778 +/* 0x1140 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2779 +/* 0x1150 */ 0x60, 0x00, 0x00, 0x01, 0x13, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2780 +/* 0x1160 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2781 +/* 0x1170 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2782 +/* 0x1180 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2783 +/* 0x1190 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2784 +/* 0x11a0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2785 +/* 0x11b0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2786 +/* 0x11c0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2787 +/* 0x11d0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2788 +/* 0x11e0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2789 +/* 0x11f0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2790 +/* 0x1200 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2791 +/* 0x1210 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2792 +/* 0x1220 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2793 +/* 0x1230 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2794 +/* 0x1240 */ 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x14, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2795 +/* 0x1250 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2796 +/* 0x1260 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2797 +/* 0x1270 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2798 +/* 0x1280 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2799 +/* 0x1290 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2800 +/* 0x12a0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2801 +/* 0x12b0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2802 +/* 0x12c0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2803 +/* 0x12d0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2804 +/* 0x12e0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2805 +/* 0x12f0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2806 +/* 0x1300 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2807 +/* 0x1310 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2808 +/* 0x1320 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2809 +/* 0x1330 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x15, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3,
2810 +/* 0x1340 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2811 +/* 0x1350 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2812 +/* 0x1360 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2813 +/* 0x1370 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2814 +/* 0x1380 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2815 +/* 0x1390 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2816 +/* 0x13a0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2817 +/* 0x13b0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2818 +/* 0x13c0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2819 +/* 0x13d0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2820 +/* 0x13e0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2821 +/* 0x13f0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2822 +/* 0x1400 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2823 +/* 0x1410 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2824 +/* 0x1420 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x16, 0x0b, 0xfc,
2825 +/* 0x1430 */ 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2826 +/* 0x1440 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2827 +/* 0x1450 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2828 +/* 0x1460 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2829 +/* 0x1470 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2830 +/* 0x1480 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2831 +/* 0x1490 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2832 +/* 0x14a0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2833 +/* 0x14b0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2834 +/* 0x14c0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2835 +/* 0x14d0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2836 +/* 0x14e0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2837 +/* 0x14f0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2838 +/* 0x1500 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2839 +/* 0x1510 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01,
2840 +/* 0x1520 */ 0x17, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2841 +/* 0x1530 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2842 +/* 0x1540 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2843 +/* 0x1550 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2844 +/* 0x1560 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2845 +/* 0x1570 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2846 +/* 0x1580 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2847 +/* 0x1590 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2848 +/* 0x15a0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2849 +/* 0x15b0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2850 +/* 0x15c0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2851 +/* 0x15d0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2852 +/* 0x15e0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2853 +/* 0x15f0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2854 +/* 0x1600 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60,
2855 +/* 0x1610 */ 0x00, 0x00, 0x01, 0x18, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2856 +/* 0x1620 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2857 +/* 0x1630 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2858 +/* 0x1640 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2859 +/* 0x1650 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2860 +/* 0x1660 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2861 +/* 0x1670 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2862 +/* 0x1680 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2863 +/* 0x1690 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2864 +/* 0x16a0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2865 +/* 0x16b0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2866 +/* 0x16c0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2867 +/* 0x16d0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2868 +/* 0x16e0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2869 +/* 0x16f0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2870 +/* 0x1700 */ 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x19, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2871 +/* 0x1710 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2872 +/* 0x1720 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2873 +/* 0x1730 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2874 +/* 0x1740 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2875 +/* 0x1750 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2876 +/* 0x1760 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2877 +/* 0x1770 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2878 +/* 0x1780 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2879 +/* 0x1790 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2880 +/* 0x17a0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2881 +/* 0x17b0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2882 +/* 0x17c0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2883 +/* 0x17d0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2884 +/* 0x17e0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2885 +/* 0x17f0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x1a, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46,
2886 +/* 0x1800 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2887 +/* 0x1810 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2888 +/* 0x1820 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2889 +/* 0x1830 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2890 +/* 0x1840 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2891 +/* 0x1850 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2892 +/* 0x1860 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2893 +/* 0x1870 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2894 +/* 0x1880 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2895 +/* 0x1890 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2896 +/* 0x18a0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2897 +/* 0x18b0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2898 +/* 0x18c0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2899 +/* 0x18d0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2900 +/* 0x18e0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x1b, 0x0b, 0xfc, 0x3e,
2901 +/* 0x18f0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2902 +/* 0x1900 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2903 +/* 0x1910 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2904 +/* 0x1920 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2905 +/* 0x1930 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2906 +/* 0x1940 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2907 +/* 0x1950 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2908 +/* 0x1960 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2909 +/* 0x1970 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2910 +/* 0x1980 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2911 +/* 0x1990 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2912 +/* 0x19a0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2913 +/* 0x19b0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2914 +/* 0x19c0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2915 +/* 0x19d0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x1c,
2916 +/* 0x19e0 */ 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2917 +/* 0x19f0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2918 +/* 0x1a00 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2919 +/* 0x1a10 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2920 +/* 0x1a20 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2921 +/* 0x1a30 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2922 +/* 0x1a40 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2923 +/* 0x1a50 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2924 +/* 0x1a60 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2925 +/* 0x1a70 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2926 +/* 0x1a80 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2927 +/* 0x1a90 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2928 +/* 0x1aa0 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2929 +/* 0x1ab0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2930 +/* 0x1ac0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00,
2931 +/* 0x1ad0 */ 0x00, 0x01, 0x1d, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2932 +/* 0x1ae0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2933 +/* 0x1af0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2934 +/* 0x1b00 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2935 +/* 0x1b10 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2936 +/* 0x1b20 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2937 +/* 0x1b30 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2938 +/* 0x1b40 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2939 +/* 0x1b50 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2940 +/* 0x1b60 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2941 +/* 0x1b70 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2942 +/* 0x1b80 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2943 +/* 0x1b90 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2944 +/* 0x1ba0 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2945 +/* 0x1bb0 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2946 +/* 0x1bc0 */ 0x18, 0x60, 0x00, 0x00, 0x01, 0x1e, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2947 +/* 0x1bd0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2948 +/* 0x1be0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2949 +/* 0x1bf0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2950 +/* 0x1c00 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2951 +/* 0x1c10 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2952 +/* 0x1c20 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2953 +/* 0x1c30 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2954 +/* 0x1c40 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2955 +/* 0x1c50 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2956 +/* 0x1c60 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2957 +/* 0x1c70 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2958 +/* 0x1c80 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2959 +/* 0x1c90 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2960 +/* 0x1ca0 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2961 +/* 0x1cb0 */ 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x1f, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18,
2962 +/* 0x1cc0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2963 +/* 0x1cd0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2964 +/* 0x1ce0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2965 +/* 0x1cf0 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2966 +/* 0x1d00 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
2967 +/* 0x1d10 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
2968 +/* 0x1d20 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
2969 +/* 0x1d30 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
2970 +/* 0x1d40 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
2971 +/* 0x1d50 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2972 +/* 0x1d60 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2973 +/* 0x1d70 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2974 +/* 0x1d80 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2975 +/* 0x1d90 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2976 +/* 0x1da0 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x20, 0x0b, 0xfc, 0x3e, 0xd1,
2977 +/* 0x1db0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
2978 +/* 0x1dc0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
2979 +/* 0x1dd0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
2980 +/* 0x1de0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
2981 +/* 0x1df0 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
2982 +/* 0x1e00 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
2983 +/* 0x1e10 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
2984 +/* 0x1e20 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
2985 +/* 0x1e30 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
2986 +/* 0x1e40 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2987 +/* 0x1e50 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2988 +/* 0x1e60 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2989 +/* 0x1e70 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2990 +/* 0x1e80 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2991 +/* 0x1e90 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x21, 0x0b,
2992 +/* 0x1ea0 */ 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
2993 +/* 0x1eb0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
2994 +/* 0x1ec0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
2995 +/* 0x1ed0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
2996 +/* 0x1ee0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
2997 +/* 0x1ef0 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
2998 +/* 0x1f00 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
2999 +/* 0x1f10 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
3000 +/* 0x1f20 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
3001 +/* 0x1f30 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
3002 +/* 0x1f40 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
3003 +/* 0x1f50 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
3004 +/* 0x1f60 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
3005 +/* 0x1f70 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
3006 +/* 0x1f80 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00,
3007 +/* 0x1f90 */ 0x01, 0x22, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
3008 +/* 0x1fa0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
3009 +/* 0x1fb0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
3010 +/* 0x1fc0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
3011 +/* 0x1fd0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
3012 +/* 0x1fe0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
3013 +/* 0x1ff0 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
3014 +/* 0x2000 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
3015 +/* 0x2010 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
3016 +/* 0x2020 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
3017 +/* 0x2030 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
3018 +/* 0x2040 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
3019 +/* 0x2050 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
3020 +/* 0x2060 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
3021 +/* 0x2070 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
3022 +/* 0x2080 */ 0x60, 0x00, 0x00, 0x01, 0x23, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
3023 +/* 0x2090 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
3024 +/* 0x20a0 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
3025 +/* 0x20b0 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61,
3026 +/* 0x20c0 */ 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86,
3027 +/* 0x20d0 */ 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18,
3028 +/* 0x20e0 */ 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61,
3029 +/* 0x20f0 */ 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86,
3030 +/* 0x2100 */ 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b,
3031 +/* 0x2110 */ 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
3032 +/* 0x2120 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
3033 +/* 0x2130 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
3034 +/* 0x2140 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
3035 +/* 0x2150 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
3036 +/* 0x2160 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
3037 +/* 0x2170 */ 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0x24, 0x0b, 0xfc, 0x3e, 0xd1, 0xa3, 0x46, 0x18, 0x6e,
3038 +/* 0x2180 */ 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8,
3039 +/* 0x2190 */ 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3,
3040 +/* 0x21a0 */ 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d,
3041 +/* 0x21b0 */ 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34,
3042 +/* 0x21c0 */ 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1,
3043 +/* 0x21d0 */ 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46,
3044 +/* 0x21e0 */ 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a,
3045 +/* 0x21f0 */ 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68,
3046 +/* 0x2200 */ 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3,
3047 +/* 0x2210 */ 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d,
3048 +/* 0x2220 */ 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34,
3049 +/* 0x2230 */ 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x6e, 0x34, 0x68, 0xd1,
3050 +/* 0x2240 */ 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18, 0x61, 0xb8, 0xd1, 0xa3, 0x46,
3051 +/* 0x2250 */ 0x18, 0x6e, 0x34, 0x68, 0xd1, 0x86, 0x1b, 0x8d, 0x1a, 0x34, 0x61, 0x86, 0xe3, 0x46, 0x8d, 0x18,
3052 +/* 0x2260 */ 0x61, 0xb8, 0xd1, 0xa3, 0x46, 0x18, 0x60, 0x00, 0x00, 0x01, 0xb7
3056 +static uint8_t preview_data[ sizeof (preview_mpg_data) + ((sizeof (preview_mpg_data) - 1) / (2048 - 6 - 3) + 1) * (6 + 3) ];
3058 +static int vdr_plugin_open(input_plugin_t *this_gen)
3060 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen;
3062 + lprintf("trying to open '%s'...\n", this->mrl);
3064 + if (this->fh == -1)
3069 + filename = (char *)&this->mrl[ 4 ];
3070 + this->fh = open(filename, O_RDONLY | O_NONBLOCK);
3072 + lprintf("filename '%s'\n", filename);
3074 + if (this->fh == -1)
3076 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3077 + _(LOG_MODULE ": failed to open '%s' (%s)\n"),
3085 + struct pollfd poll_fh = { this->fh, POLLIN, 0 };
3087 + int r = poll(&poll_fh, 1, 300);
3090 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3091 + _(LOG_MODULE ": failed to open '%s' (%s)\n"),
3093 + _("timeout expired during setup phase"));
3099 + fcntl(this->fh, F_SETFL, ~O_NONBLOCK & fcntl(this->fh, F_GETFL, 0));
3102 + char *filename_control = 0;
3103 + asprintf(&filename_control, "%s.control", filename);
3105 + this->fh_control = open(filename_control, O_RDONLY);
3107 + if (this->fh_control == -1) {
3108 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3109 + _(LOG_MODULE ": failed to open '%s' (%s)\n"),
3113 + free(filename_control);
3117 + free(filename_control);
3121 + char *filename_result = 0;
3122 + asprintf(&filename_result, "%s.result", filename);
3124 + this->fh_result = open(filename_result, O_WRONLY);
3126 + if (this->fh_result == -1) {
3129 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3130 + _(LOG_MODULE ": failed to open '%s' (%s)\n"),
3134 + free(filename_result);
3138 + free(filename_result);
3142 + char *filename_event = 0;
3143 + asprintf(&filename_event, "%s.event", filename);
3145 + this->fh_event = open(filename_event, O_WRONLY);
3147 + if (this->fh_event == -1) {
3150 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3151 + _(LOG_MODULE ": failed to open '%s' (%s)\n"),
3155 + free(filename_event);
3159 + free(filename_event);
3162 + this->rpc_thread_shutdown = 0;
3163 + if ((err = pthread_create(&this->rpc_thread, NULL,
3164 + vdr_rpc_thread_loop, (void *)this)) != 0)
3166 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3167 + _(LOG_MODULE ": can't create new thread (%s)\n"),
3176 + * mrl accepted and opened successfully at this point
3178 + * => create plugin instance
3182 + * fill preview buffer
3185 + if (!preview_data[ 2 ])
3187 + uint8_t *src = preview_mpg_data;
3188 + uint8_t *dst = preview_data;
3189 + int todo = sizeof (preview_mpg_data);
3190 + int bite = 2048 - 6 - 3;
3202 + *dst++ = (bite + 3) >> 8;
3203 + *dst++ = (bite + 3) & 0xff;
3209 + memcpy(dst, src, bite);
3217 + this->preview = (char *)&preview_data;
3218 + this->preview_size = 0; /* sizeof (preview_data); */
3224 +static void event_handler(void *user_data, const xine_event_t *event)
3226 + vdr_input_plugin_t *this = (vdr_input_plugin_t *)user_data;
3227 + uint32_t key = key_none;
3229 + lprintf("eventHandler(): event->type: %d\n", event->type);
3231 + if (XINE_EVENT_VDR_FRAMESIZECHANGED == event->type)
3233 + memcpy(&this->frame_size, event->data, event->data_length);
3235 + if (0 != internal_write_event_frame_size(this))
3236 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3237 + _(LOG_MODULE ": input event write: %s.\n"), strerror(errno));
3241 + else if (XINE_EVENT_VDR_PLUGINSTARTED == event->type)
3243 + if (0 == event->data_length) /* vdr_video */
3245 + xine_event_t event;
3247 + event.type = XINE_EVENT_VDR_TRICKSPEEDMODE;
3249 + event.data_length = this->trick_speed_mode;
3251 + xine_event_send(this->stream, &event);
3253 + else if (1 == event->data_length) /* vdr_audio */
3255 + xine_event_t event;
3256 + vdr_select_audio_data_t event_data;
3258 + event_data.channels = this->audio_channels;
3260 + event.type = XINE_EVENT_VDR_SELECTAUDIO;
3261 + event.data = &event_data;
3262 + event.data_length = sizeof (event_data);
3264 + xine_event_send(this->stream, &event);
3268 + fprintf(stderr, "input_vdr: illegal XINE_EVENT_VDR_PLUGINSTARTED: %d\n", event->data_length);
3272 + switch (event->type)
3274 + case XINE_EVENT_INPUT_UP: key = key_up; break;
3275 + case XINE_EVENT_INPUT_DOWN: key = key_down; break;
3276 + case XINE_EVENT_INPUT_LEFT: key = key_left; break;
3277 + case XINE_EVENT_INPUT_RIGHT: key = key_right; break;
3278 + case XINE_EVENT_INPUT_SELECT: key = key_ok; break;
3279 + case XINE_EVENT_VDR_BACK: key = key_back; break;
3280 + case XINE_EVENT_VDR_CHANNELPLUS: key = key_channel_plus; break;
3281 + case XINE_EVENT_VDR_CHANNELMINUS: key = key_channel_minus; break;
3282 + case XINE_EVENT_VDR_RED: key = key_red; break;
3283 + case XINE_EVENT_VDR_GREEN: key = key_green; break;
3284 + case XINE_EVENT_VDR_YELLOW: key = key_yellow; break;
3285 + case XINE_EVENT_VDR_BLUE: key = key_blue; break;
3286 + case XINE_EVENT_VDR_PLAY: key = key_play; break;
3287 + case XINE_EVENT_VDR_PAUSE: key = key_pause; break;
3288 + case XINE_EVENT_VDR_STOP: key = key_stop; break;
3289 + case XINE_EVENT_VDR_RECORD: key = key_record; break;
3290 + case XINE_EVENT_VDR_FASTFWD: key = key_fast_fwd; break;
3291 + case XINE_EVENT_VDR_FASTREW: key = key_fast_rew; break;
3292 + case XINE_EVENT_VDR_POWER: key = key_power; break;
3293 + case XINE_EVENT_VDR_SCHEDULE: key = key_schedule; break;
3294 + case XINE_EVENT_VDR_CHANNELS: key = key_channels; break;
3295 + case XINE_EVENT_VDR_TIMERS: key = key_timers; break;
3296 + case XINE_EVENT_VDR_RECORDINGS: key = key_recordings; break;
3297 + case XINE_EVENT_INPUT_MENU1: key = key_menu; break;
3298 + case XINE_EVENT_VDR_SETUP: key = key_setup; break;
3299 + case XINE_EVENT_VDR_COMMANDS: key = key_commands; break;
3300 + case XINE_EVENT_INPUT_NUMBER_0: key = key_0; break;
3301 + case XINE_EVENT_INPUT_NUMBER_1: key = key_1; break;
3302 + case XINE_EVENT_INPUT_NUMBER_2: key = key_2; break;
3303 + case XINE_EVENT_INPUT_NUMBER_3: key = key_3; break;
3304 + case XINE_EVENT_INPUT_NUMBER_4: key = key_4; break;
3305 + case XINE_EVENT_INPUT_NUMBER_5: key = key_5; break;
3306 + case XINE_EVENT_INPUT_NUMBER_6: key = key_6; break;
3307 + case XINE_EVENT_INPUT_NUMBER_7: key = key_7; break;
3308 + case XINE_EVENT_INPUT_NUMBER_8: key = key_8; break;
3309 + case XINE_EVENT_INPUT_NUMBER_9: key = key_9; break;
3310 + case XINE_EVENT_VDR_USER1: key = key_user1; break;
3311 + case XINE_EVENT_VDR_USER2: key = key_user2; break;
3312 + case XINE_EVENT_VDR_USER3: key = key_user3; break;
3313 + case XINE_EVENT_VDR_USER4: key = key_user4; break;
3314 + case XINE_EVENT_VDR_USER5: key = key_user5; break;
3315 + case XINE_EVENT_VDR_USER6: key = key_user6; break;
3316 + case XINE_EVENT_VDR_USER7: key = key_user7; break;
3317 + case XINE_EVENT_VDR_USER8: key = key_user8; break;
3318 + case XINE_EVENT_VDR_USER9: key = key_user9; break;
3319 + case XINE_EVENT_VDR_VOLPLUS: key = key_volume_plus; break;
3320 + case XINE_EVENT_VDR_VOLMINUS: key = key_volume_minus; break;
3321 + case XINE_EVENT_VDR_MUTE: key = key_mute; break;
3322 + case XINE_EVENT_VDR_AUDIO: key = key_audio; break;
3323 + case XINE_EVENT_VDR_INFO: key = key_info; break;
3328 + if (0 != internal_write_event_key(this, key))
3329 + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
3330 + _(LOG_MODULE ": input event write: %s.\n"), strerror(errno));
3333 +static input_plugin_t *vdr_class_get_instance(input_class_t *cls_gen, xine_stream_t *stream,
3336 + vdr_input_plugin_t *this;
3337 + char *mrl = strdup(data);
3339 + if (!strncasecmp(mrl, "vdr:/", 5))
3341 + lprintf("filename '%s'\n", (char *)&mrl[ 4 ]);
3350 + * mrl accepted and opened successfully at this point
3352 + * => create plugin instance
3355 + this = (vdr_input_plugin_t *)xine_xmalloc(sizeof (vdr_input_plugin_t));
3357 + this->stream = stream;
3361 + this->fh_control = -1;
3362 + this->fh_result = -1;
3363 + this->fh_event = -1;
3365 + this->input_plugin.open = vdr_plugin_open;
3366 + this->input_plugin.get_capabilities = vdr_plugin_get_capabilities;
3367 + this->input_plugin.read = vdr_plugin_read;
3368 + this->input_plugin.read_block = vdr_plugin_read_block;
3369 + this->input_plugin.seek = vdr_plugin_seek;
3370 + this->input_plugin.get_current_pos = vdr_plugin_get_current_pos;
3371 + this->input_plugin.get_length = vdr_plugin_get_length;
3372 + this->input_plugin.get_blocksize = vdr_plugin_get_blocksize;
3373 + this->input_plugin.get_mrl = vdr_plugin_get_mrl;
3374 + this->input_plugin.dispose = vdr_plugin_dispose;
3375 + this->input_plugin.get_optional_data = vdr_plugin_get_optional_data;
3376 + this->input_plugin.input_class = cls_gen;
3378 + this->cur_func = func_unknown;
3379 + this->cur_size = 0;
3380 + this->cur_done = 0;
3382 + memset(this->osd_window, 0, sizeof (this->osd_window));
3384 + this->osd_buffer = 0;
3385 + this->osd_buffer_size = 0;
3386 + this->osd_unscaled_blending = 0;
3387 + this->trick_speed_mode = 0;
3388 + this->audio_channels = 0;
3389 + this->mute_mode = INPUT_VDR_MUTE_SIMULATE;
3390 + this->dont_change_xine_volume = 0;
3391 + this->last_volume = 0;
3392 + this->frame_size.x = 0;
3393 + this->frame_size.y = 0;
3394 + this->frame_size.w = 0;
3395 + this->frame_size.h = 0;
3397 + this->stream_external = 0;
3398 + this->event_queue_external = 0;
3400 + pthread_mutex_init(&this->rpc_thread_shutdown_lock, 0);
3401 + pthread_cond_init(&this->rpc_thread_shutdown_cond, 0);
3403 + this->event_queue = xine_event_new_queue(this->stream);
3404 + if (this->event_queue)
3405 + xine_event_create_listener_thread(this->event_queue, event_handler, this);
3407 + return &this->input_plugin;
3411 + * vdr input plugin class stuff
3414 +static char *vdr_class_get_description(input_class_t *this_gen)
3416 + return _("VDR display device plugin");
3419 +static const char *vdr_class_get_identifier (input_class_t *this_gen)
3424 +static void vdr_class_dispose (input_class_t *this_gen)
3426 + vdr_input_class_t *this = (vdr_input_class_t *)this_gen;
3431 +static char **vdr_class_get_autoplay_list(input_class_t *this_gen,
3434 + vdr_input_class_t *class = (vdr_input_class_t *)this_gen;
3437 + return class->mrls;
3440 +static void *init_class(xine_t *xine, void *data)
3442 + vdr_input_class_t *this;
3444 + lprintf("init_class\n");
3446 + this = (vdr_input_class_t *)xine_xmalloc(sizeof (vdr_input_class_t));
3448 + this->xine = xine;
3450 + this->mrls[ 0 ] = "vdr:" VDR_ABS_FIFO_DIR "/stream#demux:mpeg_pes";
3451 + this->mrls[ 1 ] = 0;
3453 + this->input_class.get_instance = vdr_class_get_instance;
3454 + this->input_class.get_identifier = vdr_class_get_identifier;
3455 + this->input_class.get_description = vdr_class_get_description;
3456 + this->input_class.get_dir = NULL;
3457 + this->input_class.get_autoplay_list = vdr_class_get_autoplay_list;
3458 + this->input_class.dispose = vdr_class_dispose;
3459 + this->input_class.eject_media = NULL;
3465 + * exported plugin catalog entry
3468 +plugin_info_t xine_plugin_info[] =
3470 + /* type, API, "name", version, special_info, init_function */
3471 + { PLUGIN_INPUT, 17, "VDR", XINE_VERSION_CODE, NULL, init_class },
3472 + { PLUGIN_NONE, 0, "", 0, NULL, NULL }
3475 diff -Nurp ../xine-cvs/xine-lib/src/vdr/input_vdr.h xine-lib/src/vdr/input_vdr.h
3476 --- ../xine-cvs/xine-lib/src/vdr/input_vdr.h 1970-01-01 01:00:00.000000000 +0100
3477 +++ xine-lib/src/vdr/input_vdr.h 2006-03-15 23:06:39.000000000 +0100
3480 +#ifndef __INPUT_VDR_H
3481 +#define __INPUT_VDR_H
3484 +#define XINE_INPUT_VDR_VERSION 708
3495 + , func_osd_set_position
3496 + , func_osd_draw_bitmap
3502 + , func_set_prebuffer
3510 + , func_first_frame
3511 + , func_still_frame
3513 + , func_set_video_window
3515 + , func_play_external
3518 + , func_reset_audio
3519 + , func_select_audio
3520 + , func_trick_speed_mode
3521 + , func_get_version
3556 + key_channel_minus,
3581 +typedef struct __attribute__((packed)) data_header_s
3590 +typedef data_header_t result_header_t;
3591 +typedef data_header_t event_header_t;
3595 +typedef struct __attribute__((packed)) data_nop_s
3597 + data_header_t header;
3603 +typedef struct __attribute__((packed)) data_osd_new_s
3605 + data_header_t header;
3617 +typedef struct __attribute__((packed)) data_osd_free_s
3619 + data_header_t header;
3627 +typedef struct __attribute__((packed)) data_osd_show_s
3629 + data_header_t header;
3637 +typedef struct __attribute__((packed)) data_osd_hide_s
3639 + data_header_t header;
3647 +typedef struct __attribute__((packed)) data_osd_flush_s
3649 + data_header_t header;
3655 +typedef struct __attribute__((packed)) data_play_external_s
3657 + data_header_t header;
3659 +data_play_external_t;
3663 +typedef struct __attribute__((packed)) data_osd_set_position_s
3665 + data_header_t header;
3671 +data_osd_set_position_t;
3675 +typedef struct __attribute__((packed)) data_osd_draw_bitmap_s
3677 + data_header_t header;
3685 +data_osd_draw_bitmap_t;
3689 +typedef struct __attribute__((packed)) data_set_color_s
3691 + data_header_t header;
3701 +typedef struct __attribute__((packed)) data_flush_s
3703 + data_header_t header;
3705 + int32_t ms_timeout;
3706 + uint8_t just_wait;
3712 +typedef struct __attribute__((packed)) result_flush_s
3714 + result_header_t header;
3716 + uint8_t timed_out;
3722 +typedef struct __attribute__((packed)) data_clear_s
3724 + data_header_t header;
3733 +typedef struct __attribute__((packed)) data_mute_s
3735 + data_header_t header;
3743 +typedef struct __attribute__((packed)) data_set_volume_s
3745 + data_header_t header;
3753 +typedef struct __attribute__((packed)) data_set_speed_s
3755 + data_header_t header;
3763 +typedef struct __attribute__((packed)) data_set_prebuffer_s
3765 + data_header_t header;
3767 + uint32_t prebuffer;
3769 +data_set_prebuffer_t;
3773 +typedef struct __attribute__((packed)) data_metronom_s
3775 + data_header_t header;
3784 +typedef struct __attribute__((packed)) data_start_s
3786 + data_header_t header;
3792 +typedef struct __attribute__((packed)) data_wait_s
3794 + data_header_t header;
3800 +typedef struct __attribute__((packed)) result_wait_s
3802 + result_header_t header;
3808 +#define INPUT_VDR_MUTE_IGNORE 0
3809 +#define INPUT_VDR_MUTE_EXECUTE 1
3810 +#define INPUT_VDR_MUTE_SIMULATE 2
3812 +typedef struct __attribute__((packed)) data_setup_s
3814 + data_header_t header;
3816 + uint8_t osd_unscaled_blending;
3817 + uint8_t dont_change_xine_volume;
3818 + uint8_t mute_mode;
3824 +typedef struct __attribute__((packed)) data_first_frame_s
3826 + data_header_t header;
3828 +data_first_frame_t;
3832 +typedef struct __attribute__((packed)) data_still_frame_s
3834 + data_header_t header;
3836 +data_still_frame_t;
3840 +typedef struct __attribute__((packed)) data_set_video_window_s
3842 + data_header_t header;
3851 +data_set_video_window_t;
3855 +typedef struct __attribute__((packed)) data_grab_image_s
3857 + data_header_t header;
3863 +typedef struct __attribute__((packed)) result_grab_image_s
3865 + result_header_t header;
3872 +result_grab_image_t;
3876 +typedef struct __attribute__((packed)) data_get_pts_s
3878 + data_header_t header;
3884 +typedef struct __attribute__((packed)) result_get_pts_s
3886 + result_header_t header;
3894 +typedef struct __attribute__((packed)) data_get_version_s
3896 + data_header_t header;
3898 +data_get_version_t;
3902 +typedef struct __attribute__((packed)) result_get_version_s
3904 + result_header_t header;
3908 +result_get_version_t;
3912 +typedef struct __attribute__((packed)) data_video_size_s
3914 + data_header_t header;
3920 +typedef struct __attribute__((packed)) result_video_size_s
3922 + result_header_t header;
3932 +result_video_size_t;
3936 +typedef struct __attribute__((packed)) data_reset_audio_s
3938 + data_header_t header;
3940 +data_reset_audio_t;
3944 +typedef struct __attribute__((packed)) event_key_s
3946 + event_header_t header;
3954 +typedef struct __attribute__((packed)) event_frame_size_s
3956 + event_header_t header;
3965 +event_frame_size_t;
3969 +typedef struct __attribute__((packed)) event_play_external_s
3971 + event_header_t header;
3975 +event_play_external_t;
3979 +typedef struct __attribute__((packed)) data_select_audio_s
3981 + data_header_t header;
3985 +data_select_audio_t;
3989 +typedef struct __attribute__((packed)) data_trick_speed_mode_s
3991 + data_header_t header;
3995 +data_trick_speed_mode_t;
3999 +typedef union __attribute__((packed)) data_union_u
4001 + data_header_t header;
4003 + data_osd_new_t osd_new;
4004 + data_osd_free_t osd_free;
4005 + data_osd_show_t osd_show;
4006 + data_osd_hide_t osd_hide;
4007 + data_osd_set_position_t osd_set_position;
4008 + data_osd_draw_bitmap_t osd_draw_bitmap;
4009 + data_set_color_t set_color;
4010 + data_flush_t flush;
4011 + data_clear_t clear;
4013 + data_set_volume_t set_volume;
4014 + data_set_speed_t set_speed;
4015 + data_set_prebuffer_t set_prebuffer;
4016 + data_metronom_t metronom;
4017 + data_start_t start;
4019 + data_setup_t setup;
4020 + data_grab_image_t grab_image;
4021 + data_get_pts_t get_pts;
4022 + data_first_frame_t first_frame;
4023 + data_still_frame_t still_frame;
4024 + data_video_size_t video_size;
4025 + data_set_video_window_t set_video_window;
4026 + data_osd_flush_t osd_flush;
4027 + data_play_external_t play_external;
4028 + data_reset_audio_t reset_audio;
4029 + data_select_audio_t select_audio;
4030 + data_trick_speed_mode_t trick_speed_mode;
4031 + data_get_version_t get_version;
4037 +typedef union __attribute__((packed)) result_union_u
4039 + result_header_t header;
4040 + result_grab_image_t grab_image;
4041 + result_get_pts_t get_pts;
4042 + result_flush_t flush;
4043 + result_video_size_t video_size;
4044 + result_get_version_t get_version;
4045 + result_wait_t wait;
4051 +typedef union __attribute__((packed)) event_union_u
4053 + event_header_t header;
4055 + event_frame_size_t frame_size;
4056 + event_play_external_t play_external;
4062 +#endif /* __INPUT_VDR_H */
4064 diff -Nurp ../xine-cvs/xine-lib/src/vdr/post_vdr.c xine-lib/src/vdr/post_vdr.c
4065 --- ../xine-cvs/xine-lib/src/vdr/post_vdr.c 1970-01-01 01:00:00.000000000 +0100
4066 +++ xine-lib/src/vdr/post_vdr.c 2005-06-29 22:39:12.000000000 +0200
4069 + * Copyright (C) 2000-2004 the xine project
4071 + * This file is part of xine, a free video player.
4073 + * xine is free software; you can redistribute it and/or modify
4074 + * it under the terms of the GNU General Public License as published by
4075 + * the Free Software Foundation; either version 2 of the License, or
4076 + * (at your option) any later version.
4078 + * xine is distributed in the hope that it will be useful,
4079 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4080 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4081 + * GNU General Public License for more details.
4083 + * You should have received a copy of the GNU General Public License
4084 + * along with this program; if not, write to the Free Software
4085 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
4094 +#include "xine_internal.h"
4096 +#include "post_vdr.h"
4100 +static post_info_t vdr_video_special_info = { XINE_POST_TYPE_VIDEO_FILTER };
4101 +static post_info_t vdr_audio_special_info = { XINE_POST_TYPE_AUDIO_FILTER };
4103 +plugin_info_t xine_plugin_info[] =
4105 + /* type, API, "name", version, special_info, init_function */
4106 + { PLUGIN_POST, 9, "vdr" , XINE_VERSION_CODE, &vdr_video_special_info, &vdr_video_init_plugin },
4107 + { PLUGIN_POST, 9, "vdr_video", XINE_VERSION_CODE, &vdr_video_special_info, &vdr_video_init_plugin },
4108 + { PLUGIN_POST, 9, "vdr_audio", XINE_VERSION_CODE, &vdr_audio_special_info, &vdr_audio_init_plugin },
4109 + { PLUGIN_NONE, 0, "", 0, NULL, NULL }
4112 diff -Nurp ../xine-cvs/xine-lib/src/vdr/post_vdr.h xine-lib/src/vdr/post_vdr.h
4113 --- ../xine-cvs/xine-lib/src/vdr/post_vdr.h 1970-01-01 01:00:00.000000000 +0100
4114 +++ xine-lib/src/vdr/post_vdr.h 2005-08-14 13:56:05.000000000 +0200
4117 +#ifndef __POST_VDR_H
4118 +#define __POST_VDR_H
4122 +typedef struct vdr_set_video_window_data_s {
4130 +} vdr_set_video_window_data_t;
4134 +typedef struct vdr_frame_size_changed_data_s {
4140 +} vdr_frame_size_changed_data_t;
4144 +typedef struct vdr_select_audio_data_s {
4147 +} vdr_select_audio_data_t;
4151 +inline static int vdr_is_vdr_stream(xine_stream_t *stream)
4154 + || !stream->input_plugin
4155 + || !stream->input_plugin->input_class)
4161 + input_class_t *input_class = stream->input_plugin->input_class;
4163 + if (input_class->get_identifier)
4165 + const char *identifier = input_class->get_identifier(input_class);
4167 + && 0 == strcmp(identifier, "VDR"))
4179 +/* plugin class initialization function */
4180 +void *vdr_video_init_plugin(xine_t *xine, void *);
4181 +void *vdr_audio_init_plugin(xine_t *xine, void *);
4185 +#endif /* __POST_VDR_H */
4187 diff -Nurp ../xine-cvs/xine-lib/src/vdr/post_vdr_audio.c xine-lib/src/vdr/post_vdr_audio.c
4188 --- ../xine-cvs/xine-lib/src/vdr/post_vdr_audio.c 1970-01-01 01:00:00.000000000 +0100
4189 +++ xine-lib/src/vdr/post_vdr_audio.c 2005-08-14 13:46:41.000000000 +0200
4192 + * Copyright (C) 2000-2004 the xine project
4194 + * This file is part of xine, a free video player.
4196 + * xine is free software; you can redistribute it and/or modify
4197 + * it under the terms of the GNU General Public License as published by
4198 + * the Free Software Foundation; either version 2 of the License, or
4199 + * (at your option) any later version.
4201 + * xine is distributed in the hope that it will be useful,
4202 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4203 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4204 + * GNU General Public License for more details.
4206 + * You should have received a copy of the GNU General Public License
4207 + * along with this program; if not, write to the Free Software
4208 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
4214 + * select audio channel plugin for VDR
4217 +#define LOG_MODULE "vdr_audio"
4218 +#define LOG_VERBOSE
4223 +#include "xine_internal.h"
4225 +#include "post_vdr.h"
4229 +typedef struct vdr_audio_post_plugin_s
4231 + post_plugin_t post_plugin;
4233 + xine_event_queue_t *event_queue;
4234 + xine_stream_t *vdr_stream;
4236 + uint8_t audio_channels;
4240 +vdr_audio_post_plugin_t;
4243 +static void vdr_audio_select_audio(vdr_audio_post_plugin_t *this, uint8_t channels)
4245 + this->audio_channels = channels;
4249 +/* plugin class functions */
4250 +static post_plugin_t *vdr_audio_open_plugin(post_class_t *class_gen, int inputs,
4251 + xine_audio_port_t **audio_target,
4252 + xine_video_port_t **video_target);
4253 +static char *vdr_audio_get_identifier(post_class_t *class_gen);
4254 +static char *vdr_audio_get_description(post_class_t *class_gen);
4255 +static void vdr_audio_class_dispose(post_class_t *class_gen);
4257 +/* plugin instance functions */
4258 +static void vdr_audio_dispose(post_plugin_t *this_gen);
4260 +/* replaced ao_port functions */
4261 +static int vdr_audio_port_open(xine_audio_port_t *port_gen, xine_stream_t *stream,
4262 + uint32_t bits, uint32_t rate, int mode);
4263 +static void vdr_audio_port_put_buffer(xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_stream_t *stream);
4267 +void *vdr_audio_init_plugin(xine_t *xine, void *data)
4269 + post_class_t *class = (post_class_t *)malloc(sizeof (post_class_t));
4274 + class->open_plugin = vdr_audio_open_plugin;
4275 + class->get_identifier = vdr_audio_get_identifier;
4276 + class->get_description = vdr_audio_get_description;
4277 + class->dispose = vdr_audio_class_dispose;
4282 +static post_plugin_t *vdr_audio_open_plugin(post_class_t *class_gen, int inputs,
4283 + xine_audio_port_t **audio_target,
4284 + xine_video_port_t **video_target)
4286 + vdr_audio_post_plugin_t *this = (vdr_audio_post_plugin_t *)xine_xmalloc(sizeof (vdr_audio_post_plugin_t));
4288 + post_out_t *output;
4289 + post_audio_port_t *port;
4291 +fprintf(stderr, "~~~~~~~~~~ vdr open plugin\n");
4293 + if (!this || !audio_target || !audio_target[ 0 ])
4299 + _x_post_init(&this->post_plugin, 1, 0);
4300 + this->post_plugin.dispose = vdr_audio_dispose;
4302 + port = _x_post_intercept_audio_port(&this->post_plugin, audio_target[ 0 ], &input, &output);
4303 + port->new_port.open = vdr_audio_port_open;
4304 + port->new_port.put_buffer = vdr_audio_port_put_buffer;
4306 + this->post_plugin.xine_post.audio_input[ 0 ] = &port->new_port;
4310 + this->audio_channels = 0;
4312 + return &this->post_plugin;
4315 +static char *vdr_audio_get_identifier(post_class_t *class_gen)
4317 + return "vdr_audio";
4320 +static char *vdr_audio_get_description(post_class_t *class_gen)
4322 + return "modifies every audio frame as requested by VDR";
4325 +static void vdr_audio_class_dispose(post_class_t *class_gen)
4331 +static void vdr_audio_dispose(post_plugin_t *this_gen)
4334 +fprintf(stderr, "~~~~~~~~~~ vdr dispose\n");
4336 + if (_x_post_dispose(this_gen))
4338 + vdr_audio_post_plugin_t *this = (vdr_audio_post_plugin_t *)this_gen;
4340 + if (this->vdr_stream)
4341 + xine_event_dispose_queue(this->event_queue);
4347 +static int vdr_audio_port_open(xine_audio_port_t *port_gen, xine_stream_t *stream,
4348 + uint32_t bits, uint32_t rate, int mode) {
4350 + post_audio_port_t *port = (post_audio_port_t *)port_gen;
4351 + vdr_audio_post_plugin_t *this = (vdr_audio_post_plugin_t *)port->post;
4353 + _x_post_rewire(&this->post_plugin);
4354 + _x_post_inc_usage(port);
4356 +fprintf(stderr, "~~~~~~~~~~ vdr port open\n");
4358 + port->stream = stream;
4359 + port->bits = bits;
4360 + port->rate = rate;
4361 + port->mode = mode;
4363 + this->num_channels = _x_ao_mode2channels(mode);
4365 + return port->original_port->open(port->original_port, stream, bits, rate, mode );
4369 +static void vdr_audio_port_put_buffer(xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_stream_t *stream)
4371 + post_audio_port_t *port = (post_audio_port_t *)port_gen;
4372 + vdr_audio_post_plugin_t *this = (vdr_audio_post_plugin_t *)port->post;
4373 + xine_event_t *event;
4375 +fprintf(stderr, "~~~~~~ vdr_audio\n");
4377 + if (this->vdr_stream
4378 + && !_x_continue_stream_processing(this->vdr_stream))
4380 + this->vdr_stream = 0;
4382 + xine_event_dispose_queue(this->event_queue);
4383 + this->event_queue = 0;
4385 + this->audio_channels = 0;
4388 + if (!this->vdr_stream
4389 + && vdr_is_vdr_stream(stream))
4391 + this->event_queue = xine_event_new_queue(stream);
4392 + if (this->event_queue)
4394 + this->vdr_stream = stream;
4397 + xine_event_t event;
4399 + event.type = XINE_EVENT_VDR_PLUGINSTARTED;
4401 + event.data_length = 1; /* vdr_audio */
4403 + xine_event_send(this->vdr_stream, &event);
4408 + if (this->event_queue)
4410 + while ((event = xine_event_get(this->event_queue)))
4412 + if (event->type == XINE_EVENT_VDR_SELECTAUDIO)
4414 + vdr_select_audio_data_t *data = (vdr_select_audio_data_t *)event->data;
4416 + vdr_audio_select_audio(this, data->channels);
4419 + xine_event_free(event);
4423 + if (this->num_channels == 2
4424 + && this->audio_channels != 0
4425 + && this->audio_channels != 3)
4427 + audio_buffer_t *vdr_buf = port->original_port->get_buffer(port->original_port);
4428 + vdr_buf->num_frames = buf->num_frames;
4429 + vdr_buf->vpts = buf->vpts;
4430 + vdr_buf->frame_header_count = buf->frame_header_count;
4431 + vdr_buf->first_access_unit = buf->first_access_unit;
4432 + /* FIXME: The audio buffer should contain this info.
4433 + * We should not have to get it from the open call.
4435 + vdr_buf->format.bits = buf->format.bits;
4436 + vdr_buf->format.rate = buf->format.rate;
4437 + vdr_buf->format.mode = buf->format.mode;
4438 + _x_extra_info_merge(vdr_buf->extra_info, buf->extra_info);
4441 + int step = buf->format.bits / 8;
4442 + uint8_t *src = (uint8_t *)buf->mem;
4443 + uint8_t *dst = (uint8_t *)vdr_buf->mem;
4445 + if (this->audio_channels == 2)
4448 + fprintf(stderr, "~~~~~~~~~~ vdr port put buffer: channels: %d, %d\n"
4449 + , this->audio_channels
4450 + , buf->format.bits);
4453 + for (i = 0; i < buf->num_frames; i++)
4455 + for (k = 0; k < step; k++)
4460 + for (k = 0; k < step; k++)
4467 + /* pass data to original port */
4468 + port->original_port->put_buffer(port->original_port, vdr_buf, stream);
4470 + /* free data from origial buffer */
4471 + buf->num_frames = 0; /* UNDOCUMENTED, but hey, it works! Force old audio_out buffer free. */
4474 + port->original_port->put_buffer(port->original_port, buf, stream);
4478 diff -Nurp ../xine-cvs/xine-lib/src/vdr/post_vdr_video.c xine-lib/src/vdr/post_vdr_video.c
4479 --- ../xine-cvs/xine-lib/src/vdr/post_vdr_video.c 1970-01-01 01:00:00.000000000 +0100
4480 +++ xine-lib/src/vdr/post_vdr_video.c 2005-08-14 13:46:29.000000000 +0200
4483 + * Copyright (C) 2000-2004 the xine project
4485 + * This file is part of xine, a free video player.
4487 + * xine is free software; you can redistribute it and/or modify
4488 + * it under the terms of the GNU General Public License as published by
4489 + * the Free Software Foundation; either version 2 of the License, or
4490 + * (at your option) any later version.
4492 + * xine is distributed in the hope that it will be useful,
4493 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4494 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4495 + * GNU General Public License for more details.
4497 + * You should have received a copy of the GNU General Public License
4498 + * along with this program; if not, write to the Free Software
4499 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
4505 + * frame scaler plugin for VDR
4508 +#define LOG_MODULE "vdr_video"
4509 +#define LOG_VERBOSE
4514 +#include "xine_internal.h"
4516 +#include "post_vdr.h"
4520 +typedef struct vdr_video_post_plugin_s
4522 + post_plugin_t post_plugin;
4524 + xine_event_queue_t *event_queue;
4525 + xine_stream_t *vdr_stream;
4527 + int8_t trick_speed_mode;
4537 + int32_t old_frame_left;
4538 + int32_t old_frame_top;
4539 + int32_t old_frame_width;
4540 + int32_t old_frame_height;
4543 +vdr_video_post_plugin_t;
4546 +static void vdr_video_set_video_window(vdr_video_post_plugin_t *this, int32_t x, int32_t y, int32_t w, int32_t h, int32_t w_ref, int32_t h_ref)
4548 + this->enabled = 0;
4554 + this->w_ref = w_ref;
4555 + this->h_ref = h_ref;
4557 + if (w != w_ref || h != h_ref)
4558 + this->enabled = 1;
4562 +/* plugin class functions */
4563 +static post_plugin_t *vdr_video_open_plugin(post_class_t *class_gen, int inputs,
4564 + xine_audio_port_t **audio_target,
4565 + xine_video_port_t **video_target);
4566 +static char *vdr_video_get_identifier(post_class_t *class_gen);
4567 +static char *vdr_video_get_description(post_class_t *class_gen);
4568 +static void vdr_video_class_dispose(post_class_t *class_gen);
4570 +/* plugin instance functions */
4571 +static void vdr_video_dispose(post_plugin_t *this_gen);
4573 +/* frame intercept check */
4574 +static int vdr_video_intercept_frame(post_video_port_t *port, vo_frame_t *frame);
4576 +/* replaced vo_frame functions */
4577 +static int vdr_video_draw(vo_frame_t *frame, xine_stream_t *stream);
4580 +void *vdr_video_init_plugin(xine_t *xine, void *data)
4582 + post_class_t *class = (post_class_t *)malloc(sizeof (post_class_t));
4587 + class->open_plugin = vdr_video_open_plugin;
4588 + class->get_identifier = vdr_video_get_identifier;
4589 + class->get_description = vdr_video_get_description;
4590 + class->dispose = vdr_video_class_dispose;
4595 +static post_plugin_t *vdr_video_open_plugin(post_class_t *class_gen, int inputs,
4596 + xine_audio_port_t **audio_target,
4597 + xine_video_port_t **video_target)
4599 + vdr_video_post_plugin_t *this = (vdr_video_post_plugin_t *)xine_xmalloc(sizeof (vdr_video_post_plugin_t));
4601 + post_out_t *output;
4602 + post_video_port_t *port;
4604 + if (!this || !video_target || !video_target[ 0 ])
4610 + _x_post_init(&this->post_plugin, 0, 1);
4611 + this->post_plugin.dispose = vdr_video_dispose;
4613 + port = _x_post_intercept_video_port(&this->post_plugin, video_target[ 0 ], &input, &output);
4614 + port->intercept_frame = vdr_video_intercept_frame;
4615 + port->new_frame->draw = vdr_video_draw;
4616 + this->post_plugin.xine_post.video_input[ 0 ] = &port->new_port;
4620 + this->enabled = 0;
4621 + this->vdr_stream = 0;
4622 + this->event_queue = 0;
4623 + this->old_frame_left = 0;
4624 + this->old_frame_top = 0;
4625 + this->old_frame_width = 0;
4626 + this->old_frame_height = 0;
4627 + this->trick_speed_mode = 0;
4629 + return &this->post_plugin;
4632 +static char *vdr_video_get_identifier(post_class_t *class_gen)
4637 +static char *vdr_video_get_description(post_class_t *class_gen)
4639 + return "modifies every video frame as requested by VDR";
4642 +static void vdr_video_class_dispose(post_class_t *class_gen)
4648 +static void vdr_video_dispose(post_plugin_t *this_gen)
4650 + if (_x_post_dispose(this_gen))
4652 + vdr_video_post_plugin_t *this = (vdr_video_post_plugin_t *)this_gen;
4654 + if (this->vdr_stream)
4656 + xine_event_t event;
4657 + vdr_frame_size_changed_data_t event_data;
4664 + event.type = XINE_EVENT_VDR_FRAMESIZECHANGED;
4665 + event.data = &event_data;
4666 + event.data_length = sizeof (event_data);
4668 + xine_event_send(this->vdr_stream, &event);
4670 + xine_event_dispose_queue(this->event_queue);
4678 +static int vdr_video_intercept_frame(post_video_port_t *port, vo_frame_t *frame)
4680 + return (frame->format == XINE_IMGFMT_YUY2
4681 + || frame->format == XINE_IMGFMT_YV12);
4685 +static inline void vdr_video_scale(uint8_t *src, uint8_t *dst, int y_inc, int x_inc, int w_dst, int h_dst, int x, int y, int w, int h, int w_ref, int h_ref, int init)
4687 + int x0 = x * w_dst / w_ref;
4688 + int y0 = y * h_dst / h_ref;
4690 + int x1 = ((x + w) * w_dst - 1 + w_ref) / w_ref;
4691 + int y1 = ((y + h) * h_dst - 1 + h_ref) / h_ref;
4698 + int dy2 = dy + dy;
4699 + int h_dst2 = h_dst + h_dst;
4700 + int y_eps = h_dst - dy2;
4702 + int dx2 = dx + dx;
4703 + int w_dst2 = w_dst + w_dst;
4704 + int x_eps0 = w_dst - dx2;
4706 + for (yy = 0; yy < y0; yy++)
4708 + uint8_t *dst0 = dst;
4710 + for (xx = 0; xx < w_dst; xx++)
4719 + for (yy = y0; yy < y1; yy++)
4721 + uint8_t *dst0 = dst;
4722 + uint8_t *src0 = src;
4724 + int x_eps = x_eps0;
4726 + for (xx = 0; xx < x0; xx++)
4732 + for (xx = x0; xx < x1; xx++)
4738 + while (x_eps >= 0)
4745 + for (xx = x1; xx < w_dst; xx++)
4754 + while (y_eps >= 0)
4761 + for (yy = y1; yy < h_dst; yy++)
4763 + uint8_t *dst0 = dst;
4765 + for (xx = 0; xx < w_dst; xx++)
4775 +static void vdr_video_scale_YUY2(vdr_video_post_plugin_t *this, vo_frame_t *src, vo_frame_t *dst)
4777 + int w = dst->width - dst->crop_left - dst->crop_right;
4778 + int h = dst->height - dst->crop_top - dst->crop_bottom;
4787 + offset = dst->pitches[ 0 ] * dst->crop_top + 2 * dst->crop_left;
4788 + vdr_video_scale(&src->base[ 0 ][ 0 ] + offset, &dst->base[ 0 ][ 0 ] + offset, dst->pitches[ 0 ], 2, w , h, this->x, this->y, this->w, this->h, this->w_ref, this->h_ref, 0x00);
4789 + offset = dst->pitches[ 0 ] * dst->crop_top + 4 * ((dst->crop_left + 1) / 2);
4790 + vdr_video_scale(&src->base[ 0 ][ 1 ] + offset, &dst->base[ 0 ][ 1 ] + offset, dst->pitches[ 0 ], 4, (w + 1) / 2, h, this->x, this->y, this->w, this->h, this->w_ref, this->h_ref, 0x80);
4791 + offset = dst->pitches[ 0 ] * dst->crop_top + 4 * ((dst->crop_left + 1) / 2);
4792 + vdr_video_scale(&src->base[ 0 ][ 3 ] + offset, &dst->base[ 0 ][ 3 ] + offset, dst->pitches[ 0 ], 4, (w + 1) / 2, h, this->x, this->y, this->w, this->h, this->w_ref, this->h_ref, 0x80);
4795 +static void vdr_video_scale_YV12(vdr_video_post_plugin_t *this, vo_frame_t *src, vo_frame_t *dst)
4797 + int w = dst->width - dst->crop_left - dst->crop_right;
4798 + int h = dst->height - dst->crop_top - dst->crop_bottom;
4807 + offset = dst->pitches[ 0 ] * dst->crop_top + 1 * dst->crop_left;
4808 + vdr_video_scale(&src->base[ 0 ][ 0 ] + offset, &dst->base[ 0 ][ 0 ] + offset, dst->pitches[ 0 ], 1, w , h , this->x, this->y, this->w, this->h, this->w_ref, this->h_ref, 0x00);
4809 + offset = dst->pitches[ 1 ] * ((dst->crop_top + 1) / 2) + 1 * ((dst->crop_left + 1) / 2);
4810 + vdr_video_scale(&src->base[ 1 ][ 0 ] + offset, &dst->base[ 1 ][ 0 ] + offset, dst->pitches[ 1 ], 1, (w + 1) / 2, (h + 1) / 2, this->x, this->y, this->w, this->h, this->w_ref, this->h_ref, 0x80);
4811 + offset = dst->pitches[ 2 ] * ((dst->crop_top + 1) / 2) + 1 * ((dst->crop_left + 1) / 2);
4812 + vdr_video_scale(&src->base[ 2 ][ 0 ] + offset, &dst->base[ 2 ][ 0 ] + offset, dst->pitches[ 2 ], 1, (w + 1) / 2, (h + 1) / 2, this->x, this->y, this->w, this->h, this->w_ref, this->h_ref, 0x80);
4816 +static int vdr_video_draw(vo_frame_t *frame, xine_stream_t *stream)
4818 + post_video_port_t *port = (post_video_port_t *)frame->port;
4819 + vdr_video_post_plugin_t *this = (vdr_video_post_plugin_t *)port->post;
4820 + vo_frame_t *vdr_frame;
4821 + xine_event_t *event;
4824 + if (this->vdr_stream
4825 + && !_x_continue_stream_processing(this->vdr_stream))
4827 + this->vdr_stream = 0;
4829 + xine_event_dispose_queue(this->event_queue);
4830 + this->event_queue = 0;
4832 + this->old_frame_left = 0;
4833 + this->old_frame_top = 0;
4834 + this->old_frame_width = 0;
4835 + this->old_frame_height = 0;
4838 + if (!this->vdr_stream
4839 + && vdr_is_vdr_stream(stream))
4841 + this->event_queue = xine_event_new_queue(stream);
4842 + if (this->event_queue)
4844 + this->vdr_stream = stream;
4847 + xine_event_t event;
4849 + event.type = XINE_EVENT_VDR_PLUGINSTARTED;
4851 + event.data_length = 0; /* vdr_video */
4853 + xine_event_send(this->vdr_stream, &event);
4858 + if (this->event_queue)
4860 + while ((event = xine_event_get(this->event_queue)))
4862 + if (event->type == XINE_EVENT_VDR_SETVIDEOWINDOW)
4864 + vdr_set_video_window_data_t *data = (vdr_set_video_window_data_t *)event->data;
4866 + vdr_video_set_video_window(this, data->x, data->y, data->w, data->h, data->w_ref, data->h_ref);
4868 + else if (event->type == XINE_EVENT_VDR_TRICKSPEEDMODE)
4871 + fprintf(stderr, "###############################: %p, %d\n", event->data, event->data_length);
4872 + this->trick_speed_mode = (0 != event->data_length);
4876 + xine_event_free(event);
4881 + int frame_left = frame->crop_left;
4882 + int frame_width = frame->width - frame->crop_left - frame->crop_right;
4883 + int frame_top = frame->crop_top;
4884 + int frame_height = frame->height - frame->crop_top - frame->crop_bottom;
4886 + if (frame_left < 0)
4888 + if (frame_width > frame->width)
4889 + frame_width = frame->width;
4890 + if (frame_top < 0)
4892 + if (frame_height > frame->height)
4893 + frame_height = frame->height;
4895 + if (this->vdr_stream
4896 + && (this->old_frame_left != frame_left
4897 + || this->old_frame_top != frame_top
4898 + || this->old_frame_width != frame_width
4899 + || this->old_frame_height != frame_height))
4901 + xine_event_t event;
4902 + vdr_frame_size_changed_data_t event_data;
4904 + event_data.x = frame_left;
4905 + event_data.y = frame_top;
4906 + event_data.w = frame_width;
4907 + event_data.h = frame_height;
4909 + xprintf(this->vdr_stream->xine, XINE_VERBOSITY_LOG,
4910 + _(LOG_MODULE ": osd: (%d, %d)-(%d, %d)\n"), frame_left, frame_top, frame_width, frame_height);
4912 + event.type = XINE_EVENT_VDR_FRAMESIZECHANGED;
4913 + event.data = &event_data;
4914 + event.data_length = sizeof (event_data);
4916 + xine_event_send(this->vdr_stream, &event);
4918 + this->old_frame_left = frame_left;
4919 + this->old_frame_top = frame_top;
4920 + this->old_frame_width = frame_width;
4921 + this->old_frame_height = frame_height;
4925 + fprintf(stderr, "~~~~~~~~~~~~ trickspeedmode: %d\n", this->trick_speed_mode);
4927 + if (this->vdr_stream
4928 + && this->trick_speed_mode)
4931 + frame->next->pts = 0;
4934 + if (!this->enabled
4935 + || frame->bad_frame
4936 + || (frame->format != XINE_IMGFMT_YUY2
4937 + && frame->format != XINE_IMGFMT_YV12))
4939 + _x_post_frame_copy_down(frame, frame->next);
4940 + skip = frame->next->draw(frame->next, stream);
4941 + _x_post_frame_copy_up(frame, frame->next);
4945 + vdr_frame = port->original_port->get_frame(port->original_port,
4946 + frame->width, frame->height, frame->ratio, frame->format, frame->flags | VO_BOTH_FIELDS);
4948 + _x_post_frame_copy_down(frame, vdr_frame);
4950 + switch (vdr_frame->format)
4952 + case XINE_IMGFMT_YUY2:
4953 + vdr_video_scale_YUY2(this, frame, vdr_frame);
4956 + case XINE_IMGFMT_YV12:
4957 + vdr_video_scale_YV12(this, frame, vdr_frame);
4961 + skip = vdr_frame->draw(vdr_frame, stream);
4962 + _x_post_frame_copy_up(frame, vdr_frame);
4963 + vdr_frame->free(vdr_frame);