int gavl_time_parse(const char * str, gavl_time_t * ret) { double seconds_f; gavl_time_t seconds_t; int i_tmp; const char * start; const char * end_c; char * end; *ret = 0; start = str; if(!isdigit(*start)) return 0; while(1) { end_c = start; while(isdigit(*end_c)) end_c++; if(*end_c == '.') { *ret *= 60; /* Floating point seconds */ seconds_f = strtod(start, &end); seconds_t = gavl_seconds_to_time(seconds_f); *ret *= GAVL_TIME_SCALE; *ret += seconds_t; end_c = end; return end_c - str; } else if(*end_c != ':') { /* Integer seconds */ i_tmp = strtol(start, &end, 10); *ret *= 60; *ret += i_tmp; *ret *= GAVL_TIME_SCALE; end_c = end; return end_c - str; } else { i_tmp = strtol(start, &end, 10); *ret *= 60; *ret += i_tmp; end++; // ':' end_c = end; } if(*end_c == '\0') break; start = end_c; } return 0; }
bool ReadMedia::timeSeek(double seconds) { gavl_time_t gt = gavl_seconds_to_time( seconds ) ; lockState(); if (m_state == STATE_READY && m_file && bgav_can_seek( m_file) && seconds >= 0.0 && seconds < m_length_in_seconds ) { if (m_audio_stream_count) { m_pcm_seek = gavl_time_to_samples(m_audio_format.samplerate, gt ); if (m_pcm_seek >= m_num_samples || m_pcm_seek < 0) m_pcm_seek = SEEK_NOTHING; unlockState(); signalAV(); return true; } else if ( m_video_stream_count && m_video_format.framerate_mode == GAVL_FRAMERATE_CONSTANT ) { m_frame_seek = gavl_time_to_frames( m_video_format.timescale, m_video_format.frame_duration, gt ); if (m_frame_seek >= m_num_frames || m_frame_seek < 0 ) m_frame_seek = SEEK_NOTHING; unlockState(); signalAV(); return true; } } unlockState(); return false; }
void bg_recorder_set_video_snapshot_parameter(void * data, const char * name, const bg_parameter_value_t * val) { bg_recorder_t * rec; bg_recorder_video_stream_t * vs; if(!name) return; rec = data; vs = &rec->vs; if(!strcmp(name, "snapshot_auto")) { pthread_mutex_lock(&rec->snapshot_mutex); if(val->val_i) vs->flags |= STREAM_SNAPSHOT_AUTO; else vs->flags &= ~STREAM_SNAPSHOT_AUTO; pthread_mutex_unlock(&rec->snapshot_mutex); } else if(!strcmp(name, "snapshot_overwrite")) { if(val->val_i) vs->flags |= STREAM_SNAPSHOT_OVERWRITE; else vs->flags &= ~STREAM_SNAPSHOT_OVERWRITE; } else if(!strcmp(name, "snapshot_interval")) vs->snapshot_interval = gavl_seconds_to_time(val->val_f); else if( !strcmp(name, "plugin")) { const bg_plugin_info_t * info; if(vs->snapshot_handle && !strcmp(vs->snapshot_handle->info->name, val->val_str)) return; bg_recorder_interrupt(rec); if(vs->snapshot_handle) bg_plugin_unref(vs->snapshot_handle); info = bg_plugin_find_by_name(rec->plugin_reg, val->val_str); vs->snapshot_handle = bg_plugin_load(rec->plugin_reg, info); vs->snapshot_plugin = (bg_image_writer_plugin_t*)(vs->snapshot_handle->plugin); if(vs->snapshot_plugin->set_callbacks) vs->snapshot_plugin->set_callbacks(vs->snapshot_handle->priv, &vs->snapshot_cb); } else { vs->snapshot_plugin->common.set_parameter(vs->snapshot_handle->priv, name, val); } }