void battle_begins(int dump, t_uchar *arena, t_champ *champ, t_cycle *cycles) { t_champ *tmp; while (cycles->cycle_to_die > 0 && check_round(champ, cycles)) { tmp = champ->next; while (tmp != champ) { check_cycles(tmp, arena, cycles); tmp->cycle_to_die++; tmp = tmp->next; if (cycles->nbr_live >= NBR_LIVE) { cycles->cycle_to_die -= CYCLE_DELTA; cycles->nbr_live = 0; } } if (cycles->current_cycle == dump) dump_memory(champ, cycles, arena); cycles->current_cycle += 1; } is_there_a_winner(arena, champ, cycles); }
static void sse2_test (void) { check_round (); check_rint (); check_floor (); check_ceil (); check_trunc (); }
int main (void) { tests_start_mpfr (); mpfr_test_init (); check_round (); check_inf_nan (); tests_end_mpfr (); return 0; }
int main (void) { tests_start (); mp_trace_base = -16; check_onebit (); check_round (); check_rand (); tests_end (); exit (0); }
GF_Err ISOR_ServiceCommand(GF_InputService *plug, GF_NetworkCommand *com) { Double track_dur, media_dur; ISOMChannel *ch; ISOMReader *read; if (!plug || !plug->priv || !com) return GF_SERVICE_ERROR; read = (ISOMReader *) plug->priv; if (com->command_type==GF_NET_SERVICE_INFO) { u32 tag_len; const char *tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_NAME, &tag, &tag_len)==GF_OK) com->info.name = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_ARTIST, &tag, &tag_len)==GF_OK) com->info.artist = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_ALBUM, &tag, &tag_len)==GF_OK) com->info.album = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_COMMENT, &tag, &tag_len)==GF_OK) com->info.comment = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_TRACK, &tag, &tag_len)==GF_OK) { com->info.track_info = (((tag[2]<<8)|tag[3]) << 16) | ((tag[4]<<8)|tag[5]); } if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_COMPOSER, &tag, &tag_len)==GF_OK) com->info.composer = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_WRITER, &tag, &tag_len)==GF_OK) com->info.writer = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_GENRE, &tag, &tag_len)==GF_OK) { if (tag[0]) { com->info.genre = 0; } else { com->info.genre = (tag[0]<<8) | tag[1]; } } return GF_OK; } if (com->command_type==GF_NET_SERVICE_HAS_AUDIO) { u32 i, count; count = gf_isom_get_track_count(read->mov); for (i=0; i<count; i++) { if (gf_isom_get_media_type(read->mov, i+1) == GF_ISOM_MEDIA_AUDIO) return GF_OK; } return GF_NOT_SUPPORTED; } if (!com->base.on_channel) return GF_NOT_SUPPORTED; ch = isor_get_channel(read, com->base.on_channel); if (!ch) return GF_STREAM_NOT_FOUND; switch (com->command_type) { case GF_NET_CHAN_SET_PADDING: if (!ch->track) return GF_OK; gf_isom_set_sample_padding(read->mov, ch->track, com->pad.padding_bytes); return GF_OK; case GF_NET_CHAN_SET_PULL: ch->is_pulling = 1; return GF_OK; case GF_NET_CHAN_INTERACTIVE: return GF_OK; case GF_NET_CHAN_BUFFER: com->buffer.max = com->buffer.min = 0; return GF_OK; case GF_NET_CHAN_DURATION: if (!ch->track) { com->duration.duration = 0; return GF_OK; } ch->duration = gf_isom_get_track_duration(read->mov, ch->track); track_dur = (Double) (s64) ch->duration; track_dur /= read->time_scale; if (gf_isom_get_edit_segment_count(read->mov, ch->track)) { com->duration.duration = (Double) track_dur; ch->duration = (u32) (track_dur * ch->time_scale); } else { /*some file indicate a wrong TrackDuration, get the longest*/ ch->duration = gf_isom_get_media_duration(read->mov, ch->track); media_dur = (Double) (s64) ch->duration; media_dur /= ch->time_scale; com->duration.duration = MAX(track_dur, media_dur); } return GF_OK; case GF_NET_CHAN_PLAY: if (!ch->is_pulling) return GF_NOT_SUPPORTED; assert(!ch->is_playing); isor_reset_reader(ch); ch->speed = com->play.speed; ch->start = ch->end = 0; if (com->play.speed>0) { if (com->play.start_range>=0) { ch->start = (u64) (s64) (com->play.start_range * ch->time_scale); ch->start = check_round(ch, ch->start, com->play.start_range, 1); } if (com->play.end_range >= com->play.start_range) { ch->end = (u64) (s64) (com->play.end_range*ch->time_scale); ch->end = check_round(ch, ch->end, com->play.end_range, 0); } } else if (com->play.speed<0) { if (com->play.end_range>=com->play.start_range) ch->start = (u64) (s64) (com->play.start_range * ch->time_scale); if (com->play.end_range >= 0) ch->end = (u64) (s64) (com->play.end_range*ch->time_scale); } ch->is_playing = 1; if (com->play.dash_segment_switch) ch->wait_for_segment_switch = 1; GF_LOG(GF_LOG_DEBUG, GF_LOG_NETWORK, ("[IsoMedia] Starting channel playback "LLD" to "LLD" (%g to %g)\n", ch->start, ch->end, com->play.start_range, com->play.end_range)); return GF_OK; case GF_NET_CHAN_STOP: isor_reset_reader(ch); return GF_OK; /*nothing to do on MP4 for channel config*/ case GF_NET_CHAN_CONFIG: return GF_OK; case GF_NET_CHAN_GET_PIXEL_AR: return gf_isom_get_pixel_aspect_ratio(read->mov, ch->track, 1, &com->par.hSpacing, &com->par.vSpacing); case GF_NET_CHAN_GET_DSI: { /*it may happen that there are conflicting config when using ESD URLs...*/ GF_DecoderConfig *dcd = gf_isom_get_decoder_config(read->mov, ch->track, 1); com->get_dsi.dsi = NULL; com->get_dsi.dsi_len = 0; if (dcd) { if (dcd->decoderSpecificInfo) { com->get_dsi.dsi = dcd->decoderSpecificInfo->data; com->get_dsi.dsi_len = dcd->decoderSpecificInfo->dataLength; dcd->decoderSpecificInfo->data = NULL; } gf_odf_desc_del((GF_Descriptor *) dcd); } } return GF_OK; } return GF_NOT_SUPPORTED; }
GF_Err ISOR_ServiceCommand(GF_InputService *plug, GF_NetworkCommand *com) { Double track_dur, media_dur; ISOMChannel *ch; ISOMReader *read; u32 count, i; if (!plug || !plug->priv || !com) return GF_SERVICE_ERROR; read = (ISOMReader *) plug->priv; if (read->disconnected) return GF_OK; if (com->command_type==GF_NET_SERVICE_INFO) { u32 tag_len; const char *tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_NAME, &tag, &tag_len)==GF_OK) com->info.name = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_ARTIST, &tag, &tag_len)==GF_OK) com->info.artist = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_ALBUM, &tag, &tag_len)==GF_OK) com->info.album = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_COMMENT, &tag, &tag_len)==GF_OK) com->info.comment = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_TRACK, &tag, &tag_len)==GF_OK) { com->info.track_info = (((tag[2]<<8)|tag[3]) << 16) | ((tag[4]<<8)|tag[5]); } if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_COMPOSER, &tag, &tag_len)==GF_OK) com->info.composer = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_WRITER, &tag, &tag_len)==GF_OK) com->info.writer = tag; if (gf_isom_apple_get_tag(read->mov, GF_ISOM_ITUNE_GENRE, &tag, &tag_len)==GF_OK) { if (tag[0]) { com->info.genre = 0; } else { com->info.genre = (tag[0]<<8) | tag[1]; } } return GF_OK; } if (com->command_type==GF_NET_SERVICE_HAS_AUDIO) { u32 i, count; count = gf_isom_get_track_count(read->mov); for (i=0; i<count; i++) { if (gf_isom_get_media_type(read->mov, i+1) == GF_ISOM_MEDIA_AUDIO) return GF_OK; } return GF_NOT_SUPPORTED; } if (com->command_type == GF_NET_SERVICE_QUALITY_SWITCH) { count = gf_list_count(read->channels); for (i = 0; i < count; i++) { ch = (ISOMChannel *)gf_list_get(read->channels, i); if (gf_isom_has_scalable_layer(read->mov)) { ch->next_track = gf_channel_switch_quality(ch, read->mov, com->switch_quality.up); } } return GF_OK; } if (com->command_type == GF_NET_SERVICE_PROXY_DATA_RECEIVE) { isor_flush_data(read, 1, com->proxy_data.is_chunk); return GF_OK; } if (com->command_type == GF_NET_SERVICE_FLUSH_DATA) { if (read->nb_playing && plug->query_proxy) isor_flush_data(read, 0, 0); return GF_OK; } if (com->command_type == GF_NET_SERVICE_CAN_REVERSE_PLAYBACK) return GF_OK; if (!com->base.on_channel) return GF_NOT_SUPPORTED; ch = isor_get_channel(read, com->base.on_channel); if (!ch) return GF_STREAM_NOT_FOUND; switch (com->command_type) { case GF_NET_CHAN_SET_PADDING: if (!ch->track) return GF_OK; gf_isom_set_sample_padding(read->mov, ch->track, com->pad.padding_bytes); return GF_OK; case GF_NET_CHAN_SET_PULL: //we don't pull in DASH base services, we flush as soon as we have a complete segment #ifndef DASH_USE_PULL if (read->input->proxy_udta && !read->input->proxy_type) return GF_NOT_SUPPORTED; #endif ch->is_pulling = 1; return GF_OK; case GF_NET_CHAN_INTERACTIVE: return GF_OK; case GF_NET_CHAN_BUFFER: //dash or HTTP, do rebuffer if not disabled if (plug->query_proxy) { } else if (read->dnload) { ch->buffer_min = com->buffer.min; ch->buffer_max = com->buffer.max; } else { com->buffer.max = com->buffer.min = 0; } return GF_OK; case GF_NET_CHAN_DURATION: if (!ch->track) { com->duration.duration = 0; return GF_OK; } ch->duration = gf_isom_get_track_duration(read->mov, ch->track); track_dur = (Double) (s64) ch->duration; track_dur /= read->time_scale; if (gf_isom_get_edit_segment_count(read->mov, ch->track)) { com->duration.duration = (Double) track_dur; ch->duration = (u32) (track_dur * ch->time_scale); } else { /*some file indicate a wrong TrackDuration, get the longest*/ ch->duration = gf_isom_get_media_duration(read->mov, ch->track); media_dur = (Double) (s64) ch->duration; media_dur /= ch->time_scale; com->duration.duration = MAX(track_dur, media_dur); } return GF_OK; case GF_NET_CHAN_PLAY: gf_mx_p(read->segment_mutex); isor_reset_reader(ch); ch->speed = com->play.speed; read->reset_frag_state = 1; if (read->frag_type) read->frag_type = 1; gf_mx_v(read->segment_mutex); ch->start = ch->end = 0; if (com->play.speed>0) { if (com->play.start_range>=0) { ch->start = (u64) (s64) (com->play.start_range * ch->time_scale); ch->start = check_round(ch, ch->start, com->play.start_range, 1); } if (com->play.end_range >= com->play.start_range) { ch->end = (u64) (s64) (com->play.end_range*ch->time_scale); ch->end = check_round(ch, ch->end, com->play.end_range, 0); } } else if (com->play.speed<0) { Double end = com->play.end_range; if (end==-1) end = 0; ch->start = (u64) (s64) (com->play.start_range * ch->time_scale); if (end <= com->play.start_range) ch->end = (u64) (s64) (end * ch->time_scale); } ch->is_playing = 1; if (com->play.dash_segment_switch) ch->wait_for_segment_switch = 1; GF_LOG(GF_LOG_DEBUG, GF_LOG_NETWORK, ("[IsoMedia] Starting channel playback "LLD" to "LLD" (%g to %g)\n", ch->start, ch->end, com->play.start_range, com->play.end_range)); //and check buffer level on play request isor_check_buffer_level(read); read->nb_playing++; return GF_OK; case GF_NET_CHAN_STOP: if (read->nb_playing) read->nb_playing--; isor_reset_reader(ch); return GF_OK; case GF_NET_CHAN_SET_SPEED: gf_mx_p(read->segment_mutex); ch->speed = com->play.speed; gf_mx_v(read->segment_mutex); return GF_OK; /*nothing to do on MP4 for channel config*/ case GF_NET_CHAN_CONFIG: return GF_OK; case GF_NET_CHAN_GET_PIXEL_AR: return gf_isom_get_pixel_aspect_ratio(read->mov, ch->track, 1, &com->par.hSpacing, &com->par.vSpacing); case GF_NET_CHAN_GET_DSI: { /*it may happen that there are conflicting config when using ESD URLs...*/ GF_DecoderConfig *dcd = gf_isom_get_decoder_config(read->mov, ch->track, 1); com->get_dsi.dsi = NULL; com->get_dsi.dsi_len = 0; if (dcd) { if (dcd->decoderSpecificInfo) { com->get_dsi.dsi = dcd->decoderSpecificInfo->data; com->get_dsi.dsi_len = dcd->decoderSpecificInfo->dataLength; dcd->decoderSpecificInfo->data = NULL; } gf_odf_desc_del((GF_Descriptor *) dcd); } return GF_OK; } case GF_NET_CHAN_NALU_MODE: ch->nalu_extract_mode = GF_ISOM_NALU_EXTRACT_INBAND_PS_FLAG; ch->disable_seek = 1; //when this is set, we work in real scalable (eg N streams reassembled by the player) so only extract the layer. This wll need refinements if we plan to support //several scalable layers ... if (com->nalu_mode.extract_mode==1) { ch->nalu_extract_mode |= GF_ISOM_NALU_EXTRACT_ANNEXB_FLAG | GF_ISOM_NALU_EXTRACT_VDRD_FLAG | GF_ISOM_NALU_EXTRACT_LAYER_ONLY; } gf_isom_set_nalu_extract_mode(ch->owner->mov, ch->track, ch->nalu_extract_mode); break; default: break; } return GF_NOT_SUPPORTED; }