From: Guenter B. <gu...@us...> - 2001-11-15 23:18:07
|
Update of /cvsroot/xine/xine-lib/src/xine-engine In directory usw-pr-cvs1:/tmp/cvs-serv6226/src/xine-engine Modified Files: audio_decoder.c video_decoder.c video_out.c video_out.h xine.c xine_internal.h Log Message: improved audio/spu channel selection, let the user take control over both if he/she wants to Index: audio_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/audio_decoder.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- audio_decoder.c 2001/11/15 17:11:20 1.53 +++ audio_decoder.c 2001/11/15 23:18:04 1.54 @@ -109,7 +109,7 @@ pthread_mutex_unlock (&this->finished_lock); - this->audio_channel_suggested = -1; + this->audio_channel_auto = -1; /* future magic - coming soon lrb_flush (this->audio_temp); @@ -153,7 +153,7 @@ { printf ("audio_decoder: suggested switching to stream_id %02x\n", buf->decoder_info[0]); - this->audio_channel_suggested = buf->decoder_info[0] & 0xff; + this->audio_channel_auto = buf->decoder_info[0] & 0xff; } break; @@ -177,12 +177,14 @@ uint32_t audio_type = 0; int i,j; -/* - printf("AUDIO DECODER:%08X %08X %08X %08X\n", - buf->type, this->audio_type, - this->audio_channel_suggested, - this->audio_channel); - */ + + /* + printf("audio_decoder: buf_type=%08x auto=%08x user=%08x\n", + buf->type, + this->audio_channel_auto, + this->audio_channel_user); + */ + /* update track map */ i = 0; @@ -201,58 +203,62 @@ } /* find out which audio type to decode */ - - if (this->audio_channel == -1) { - audio_type = this->audio_track_map[0]; - } else { - audio_type = this->audio_track_map[this->audio_channel]; - } - if ((this->audio_channel_suggested>=0) && - ((buf->type & 0xFF) == this->audio_channel_suggested) ) { - audio_type = buf->type; - this->audio_channel_suggested = -1; - } - /* now, decode this buffer if it's the right audio type */ + if (this->audio_channel_user > -2) { - if (buf->type == audio_type) { - - int streamtype = (buf->type>>16) & 0xFF; + if (this->audio_channel_user == -1) { - decoder = this->audio_decoder_plugins [streamtype]; + /* auto */ - /* close old decoder of audio type has changed */ + if (this->audio_channel_auto>=0) { + + if ((buf->type & 0xFF) == this->audio_channel_auto) { + audio_type = buf->type; + } else + audio_type = -1; - if (audio_type != this->audio_type) { + } else + audio_type = this->audio_track_map[0]; - if (this->cur_audio_decoder_plugin) { - this->cur_audio_decoder_plugin->close (this->cur_audio_decoder_plugin); - this->cur_audio_decoder_plugin = NULL; - } + } else + audio_type = this->audio_track_map[this->audio_channel_user]; - if (decoder) { - xine_event_t event; - printf ("audio_loop: using decoder >%s< \n", - decoder->get_identifier()); - this->cur_audio_decoder_plugin = decoder; - this->cur_audio_decoder_plugin->init (this->cur_audio_decoder_plugin, this->audio_out); + /* now, decode this buffer if it's the right audio type */ + + if (buf->type == audio_type) { + + int streamtype = (buf->type>>16) & 0xFF; + + decoder = this->audio_decoder_plugins [streamtype]; + + /* close old decoder of audio type has changed */ + + if (audio_type != this->audio_type) { + + if (this->cur_audio_decoder_plugin) { + this->cur_audio_decoder_plugin->close (this->cur_audio_decoder_plugin); + this->cur_audio_decoder_plugin = NULL; + } - this->audio_type = audio_type; - for (i=0;i < this->audio_track_map_entries; i++) { - if ( this->audio_track_map[i] == audio_type) { - this->audio_channel=i; - break; - } - } - event.type = XINE_EVENT_UI_CHANNELS_CHANGED; - xine_send_event(this, &event); + if (decoder) { + xine_event_t event; + printf ("audio_loop: using decoder >%s< \n", + decoder->get_identifier()); + this->cur_audio_decoder_plugin = decoder; + this->cur_audio_decoder_plugin->init (this->cur_audio_decoder_plugin, this->audio_out); + + this->audio_type = audio_type; + + event.type = XINE_EVENT_UI_CHANNELS_CHANGED; + xine_send_event(this, &event); + } } - } - - /* finally - decode data */ - - if (decoder) + + /* finally - decode data */ + + if (decoder) decoder->decode_data (decoder, buf); + } } } else printf ("audio_loop: unknown buffer type: %08x\n", buf->type); @@ -279,8 +285,8 @@ } this->audio_fifo = fifo_buffer_new (50, 8192); - this->audio_channel = -1; - this->audio_channel_suggested = -1; + this->audio_channel_user = -1; + this->audio_channel_auto = 0; this->audio_type = 0; /* future magic - coming soon @@ -330,16 +336,15 @@ pthread_mutex_lock (&this->xine_lock); - if (channel < -1) - channel = -1; + if (channel < -2) + channel = -2; - this->audio_channel = channel; + this->audio_channel_user = channel; pthread_mutex_unlock (&this->xine_lock); } int xine_get_audio_selection (xine_t *this) { - - return this->audio_channel; + return this->audio_channel_user; } Index: video_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_decoder.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -r1.63 -r1.64 --- video_decoder.c 2001/11/13 21:47:59 1.63 +++ video_decoder.c 2001/11/15 23:18:04 1.64 @@ -145,7 +145,9 @@ break; case BUF_CONTROL_SPU_CHANNEL: - this->spu_channel = buf->decoder_info[0]; + this->spu_channel_auto = buf->decoder_info[0]; + if (this->spu_channel_user == -1) + this->spu_channel = this->spu_channel_auto; break; case BUF_CONTROL_END: Index: video_out.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_out.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- video_out.c 2001/11/13 21:47:59 1.53 +++ video_out.c 2001/11/15 23:18:04 1.54 @@ -304,7 +304,7 @@ profiler_start_count (prof_spu_blend); ovl = this->overlay_source->get_overlay (this->overlay_source, img->PTS); - if (this->video_loop_running && ovl && this->driver->overlay_blend) + if (this->video_loop_running && ovl && this->driver->overlay_blend && this->overlay_enabled) this->driver->overlay_blend (this->driver, img, ovl); profiler_stop_count (prof_spu_blend); @@ -578,6 +578,10 @@ this->overlay_source = NULL; } +static void vo_enable_overlay (vo_instance_t *this, int overlay_enabled) { + this->overlay_enabled = overlay_enabled; +} + vo_instance_t *vo_new_instance (vo_driver_t *driver, metronom_t *metronom) { vo_instance_t *this; @@ -595,6 +599,7 @@ this->get_capabilities = vo_get_capabilities; this->register_ovl_src = vo_register_ovl_src; this->unregister_ovl_src = vo_unregister_ovl_src; + this->enable_ovl = vo_enable_overlay; this->num_frames_delivered = 0; this->num_frames_skipped = 0; @@ -604,6 +609,7 @@ this->video_loop_running = 0; this->pts_per_frame = 0; this->pts_per_half_frame = 0; + this->overlay_enabled = 1; for (i=0; i<NUM_FRAME_BUFFERS; i++) { vo_frame_t *img; Index: video_out.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_out.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- video_out.h 2001/11/13 21:47:59 1.28 +++ video_out.h 2001/11/15 23:18:04 1.29 @@ -134,7 +134,9 @@ /* overlay stuff */ void (*register_ovl_src) (vo_instance_t *this, ovl_src_t *ovl_src); void (*unregister_ovl_src) (vo_instance_t *this, ovl_src_t *ovl_src); + void (*enable_ovl) (vo_instance_t *this, int ovl_enable); ovl_src_t *overlay_source; + int overlay_enabled; /* video driver is no longer used by decoder => close */ void (*close) (vo_instance_t *this); Index: xine.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/xine.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- xine.c 2001/10/22 17:10:21 1.72 +++ xine.c 2001/11/15 23:18:04 1.73 @@ -427,9 +427,9 @@ load_demux_plugins(this, config, DEMUXER_PLUGIN_IFACE_VERSION); - this->audio_channel = 0; - this->spu_channel = -1; - this->cur_input_pos = 0; + this->spu_channel_auto = -1; + this->spu_channel_user = -1; + this->cur_input_pos = 0; /* * init and start decoder threads @@ -451,15 +451,29 @@ int xine_get_spu_channel (xine_t *this) { - return this->spu_channel; + return this->spu_channel_user; } void xine_select_spu_channel (xine_t *this, int channel) { pthread_mutex_lock (&this->xine_lock); - this->spu_channel = (channel >= -1 ? channel : -1); + this->spu_channel_user = (channel >= -2 ? channel : -2); + switch (this->spu_channel_user) { + case -2: + this->spu_channel = -1; + this->video_out->enable_ovl (this->video_out, 0); + break; + case -1: + this->spu_channel = this->spu_channel_auto; + this->video_out->enable_ovl (this->video_out, 1); + break; + default: + this->spu_channel = this->spu_channel_user; + this->video_out->enable_ovl (this->video_out, 1); + } + pthread_mutex_unlock (&this->xine_lock); } @@ -646,28 +660,55 @@ void xine_get_spu_lang (xine_t *this, char *str) { - if (this->cur_input_plugin) { - if (this->cur_input_plugin->get_capabilities (this->cur_input_plugin) & INPUT_CAP_SPULANG) { - this->cur_input_plugin->get_optional_data (this->cur_input_plugin, str, - INPUT_OPTIONAL_DATA_SPULANG); - return; - } - } + switch (this->spu_channel_user) { + case -2: + sprintf (str, "off"); + break; + case -1: + if (this->cur_input_plugin) { + if (this->cur_input_plugin->get_capabilities (this->cur_input_plugin) & INPUT_CAP_SPULANG) { + this->cur_input_plugin->get_optional_data (this->cur_input_plugin, this->str, + INPUT_OPTIONAL_DATA_SPULANG); + sprintf (str, "*(%s)", this->str); + return; + } + } + if (this->spu_channel_auto == -1) + sprintf (str, "*(off)"); + else + sprintf (str, "*(%3d)", this->spu_channel_auto); + break; + default: + sprintf (str, "%3d", this->spu_channel_user); + } - sprintf (str, "%3d", this->spu_channel); } void xine_get_audio_lang (xine_t *this, char *str) { - if (this->cur_input_plugin) { - if (this->cur_input_plugin->get_capabilities (this->cur_input_plugin) & INPUT_CAP_AUDIOLANG) { - this->cur_input_plugin->get_optional_data (this->cur_input_plugin, str, - INPUT_OPTIONAL_DATA_AUDIOLANG); - return; - } - } - - sprintf (str, "%3d", this->audio_channel); + switch (this->audio_channel_user) { + case -2: + sprintf (str, "off"); + break; + case -1: + if (this->cur_input_plugin) { + if (this->cur_input_plugin->get_capabilities (this->cur_input_plugin) & INPUT_CAP_AUDIOLANG) { + this->cur_input_plugin->get_optional_data (this->cur_input_plugin, this->str, + INPUT_OPTIONAL_DATA_AUDIOLANG); + + sprintf (str, "*(%s)", this->str); + + return; + } + } + if (this->audio_channel_auto == -1) + sprintf (str, "*(off)"); + else + sprintf (str, "*(%3d)", this->audio_channel_auto); + break; + default: + sprintf (str, "%3d", this->audio_channel_user); + } } Index: xine_internal.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/xine_internal.h,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- xine_internal.h 2001/11/13 21:47:59 1.54 +++ xine_internal.h 2001/11/15 23:18:04 1.55 @@ -164,8 +164,15 @@ spu_decoder_t *cur_spu_decoder_plugin; int spu_finished; - int audio_channel; - int audio_channel_suggested; + /* *_user: -2 => off + -1 => auto (use *_auto value) + >=0 => respect the user's choice + */ + + int audio_channel_user; + int audio_channel_auto; + int spu_channel_user; + int spu_channel_auto; int spu_channel; vo_instance_t *video_out; @@ -198,6 +205,9 @@ xine_event_listener_t event_listeners[XINE_MAX_EVENT_LISTENERS]; void *event_listener_user_data[XINE_MAX_EVENT_LISTENERS]; uint16_t num_event_listeners; + + /* scratch string buffer */ + char str[1024]; }; /* |