static void set_header_vorbis(bg_db_object_t * obj, const gavl_metadata_t * req, gavl_metadata_t * res) { char * tmp_string; gavl_metadata_set(res, "Content-Type", "audio/ogg"); if(obj->duration > 0) { tmp_string = bg_sprintf("%f", gavl_time_to_seconds(obj->duration)); gavl_metadata_set(res, "X-Content-Duration", tmp_string); free(tmp_string); } }
int64_t bg_upnp_transcoder_get_size(const bg_upnp_transcoder_t * t, bg_db_object_t * obj) { int bitrate = t->get_bitrate(obj); return (int64_t)(bitrate / 8 * gavl_time_to_seconds(obj->duration) + 0.5); }
int main(int argc, char ** argv) { bg_plugin_registry_t * plugin_reg; bg_cfg_registry_t * cfg_reg; bg_cfg_section_t * cfg_section; int i; char * tmp_path; bg_track_info_t * info; /* Plugins */ bg_input_plugin_t * input_plugin; /* Plugin handles */ bg_plugin_handle_t * input_handle = NULL; /* Frames */ gavl_video_frame_t * frame = NULL; gavl_video_format_t in_format; gavl_video_format_t out_format; /* Filter chain */ /* Create registries */ char ** gmls = NULL; gavl_video_source_t * src; gavl_timer_t * timer = gavl_timer_create(); cfg_reg = bg_cfg_registry_create(); tmp_path = bg_search_file_read("generic", "config.xml"); bg_cfg_registry_load(cfg_reg, tmp_path); if(tmp_path) free(tmp_path); cfg_section = bg_cfg_registry_find_section(cfg_reg, "plugins"); plugin_reg = bg_plugin_registry_create(cfg_section); /* Create filter chain */ memset(&opt, 0, sizeof(opt)); bg_gavl_video_options_init(&opt); fc = bg_video_filter_chain_create(&opt, plugin_reg); fv_parameters = bg_video_filter_chain_get_parameters(fc); fv_section = bg_cfg_section_create_from_parameters("fv", fv_parameters); opt_section = bg_cfg_section_create_from_parameters("opt", opt_parameters); /* Get commandline options */ bg_cmdline_init(&app_data); update_global_options(); bg_cmdline_parse(global_options, &argc, &argv, NULL); gmls = bg_cmdline_get_locations_from_args(&argc, &argv); if(!gmls || !gmls[0]) { fprintf(stderr, "No input file given\n"); return 0; } if(!gmls[1]) { fprintf(stderr, "No output file given\n"); return 0; } if(gmls[2]) { fprintf(stderr, "Unknown argument %s\n", gmls[2]); } /* Load input plugin */ if(!bg_input_plugin_load(plugin_reg, gmls[0], NULL, &input_handle, NULL, 0)) { fprintf(stderr, "Cannot open %s\n", gmls[0]); return -1; } input_plugin = (bg_input_plugin_t*)(input_handle->plugin); info = input_plugin->get_track_info(input_handle->priv, 0); /* Select track */ if(input_plugin->set_track) input_plugin->set_track(input_handle->priv, 0); if(!info->num_video_streams) { fprintf(stderr, "File %s has no video\n", gmls[0]); return -1; } /* Select first stream */ input_plugin->set_video_stream(input_handle->priv, 0, BG_STREAM_ACTION_DECODE); /* Start playback */ if(input_plugin->start) input_plugin->start(input_handle->priv); gavl_video_format_copy(&in_format, &info->video_streams[0].format); /* Initialize filter chain */ src = input_plugin->get_video_source(input_handle->priv, 0); src = bg_video_filter_chain_connect(fc, src); if(frameno >= 0) { frame = NULL; gavl_timer_start(timer); for(i = 0; i < frameno+1; i++) { if(gavl_video_source_read_frame(src, &frame) != GAVL_SOURCE_OK) { fprintf(stderr, "Unexpected EOF\n"); return -1; } } gavl_timer_stop(timer); } else { frame = NULL; gavl_timer_start(timer); while(1) { if(gavl_video_source_read_frame(src, &frame) != GAVL_SOURCE_OK) { break; } } gavl_timer_stop(timer); } fprintf(stderr, "Processing took %f seconds\n", gavl_time_to_seconds(gavl_timer_get(timer))); bg_plugin_registry_save_image(plugin_reg, gmls[1], frame, &out_format, NULL); /* Destroy everything */ bg_plugin_unref(input_handle); bg_video_filter_chain_destroy(fc); bg_gavl_video_options_free(&opt); bg_plugin_registry_destroy(plugin_reg); bg_cfg_registry_destroy(cfg_reg); gavl_timer_destroy(timer); return 0; }
bool ReadMedia::initFormat() { const gavl_audio_format_t * open_audio_format; const gavl_video_format_t * open_video_format; // we use the m_vfifosize to see if the user app wants video or not // then, we set m_video_stream_count to 0 if he doesn't want video if (m_video_stream_count > 0 && m_vfifosize > 0) { open_video_format = bgav_get_video_format(m_file, 0); if (open_video_format->pixelformat == GAVL_PIXELFORMAT_NONE) { printf("!!!sorry, pixelformat is not recognized.\n"); return false; } // let's check to see if the formats are the same, if they are the same // there is no reason to recreate the fifo or frames if ( gavl_video_formats_equal( &m_video_format, open_video_format) == 0 ) { // the formats are different gavl_video_format_copy (&m_video_format, open_video_format); if (m_video_frame != NULL) gavl_video_frame_destroy(m_video_frame); m_video_frame = gavl_video_frame_create(&m_video_format); gavl_video_frame_clear( m_video_frame, &m_video_format); if (m_fifovideo != NULL) delete m_fifovideo; m_fifovideo= new FifoVideoFrames( m_vfifosize , &m_video_format); } } else { m_video_stream_count = 0; m_veof = true; } // we use the m_afifosize to see if the user app wants audio or not // then, we set m_audio_stream_count to 0 if he doesn't want audio if (m_audio_stream_count > 0 && m_afifosize > 0) { open_audio_format = bgav_get_audio_format(m_file, 0); // we can get audio formats that are unkown if ( open_audio_format->sample_format == GAVL_SAMPLE_NONE) { printf("sorry, this file has unsupported audio.\n"); return false; } if ( gavl_audio_formats_equal(&m_audio_format, open_audio_format) == 0 ) { // audio formats are different // save the old spf int spf = m_audio_format.samples_per_frame; gavl_audio_format_copy(&m_audio_format, open_audio_format); if (m_audio_frame != NULL) { gavl_audio_frame_destroy(m_audio_frame); } // set it back to original m_audio_format.samples_per_frame = spf ; m_audio_frame = gavl_audio_frame_create(&m_audio_format); gavl_audio_frame_mute( m_audio_frame, &m_audio_format); if( m_fifoaudio != NULL ) delete m_fifoaudio; m_fifoaudio = new FifoAudioFrames( m_afifosize , &m_audio_format); } } else { // user doesn't want audio m_audio_stream_count = 0; m_aeof=true; } m_length_in_gavltime = bgav_get_duration ( m_file, 0);; m_length_in_seconds = gavl_time_to_seconds( m_length_in_gavltime ); m_num_samples = 0; m_num_frames = 0; if (m_audio_stream_count) { if ( bgav_can_seek_sample(m_file) == 1 ) { m_num_samples= bgav_audio_duration ( m_file, 0) ; } else { m_num_samples= gavl_time_to_samples( m_audio_format.samplerate , bgav_get_duration ( m_file, 0) ); } } // set frames WE NEED TO take care here for non-constant frame-rates if(m_video_stream_count) { if ( bgav_can_seek_sample(m_file) == 1 && m_video_format.framerate_mode == GAVL_FRAMERATE_CONSTANT) { m_num_frames = bgav_video_duration ( m_file, 0)/ m_video_format.frame_duration; } else if ( bgav_can_seek_sample(m_file) == 1 && m_video_format.framerate_mode == GAVL_FRAMERATE_VARIABLE ) { // FIXME what to do with non constant frame rates? m_num_frames=0; } else { m_num_frames = gavl_time_to_frames( m_video_format.timescale, m_video_format.frame_duration , bgav_get_duration ( m_file, 0) ); } } // printf("m_num_frames =%lld, duration = %lld , vid_duration=%lld\n", // m_num_frames, bgav_get_duration ( m_file, 0), bgav_video_duration ( m_file, 0) ); // set seconds if ( bgav_can_seek_sample(m_file) == 1) { gavl_time_t atime=0,vtime=0; if ( m_audio_stream_count ) atime = gavl_samples_to_time( m_audio_format.samplerate, m_num_samples ); if (m_video_stream_count && m_video_format.frame_duration > 0) { vtime = gavl_frames_to_time( m_video_format.timescale, m_video_format.frame_duration, m_num_frames ); } else if ( m_video_stream_count ) { // non constant framerate vtime = bgav_video_duration( m_file, 0); } // else rely on audio time m_length_in_gavltime = atime > vtime ? atime :vtime; m_length_in_seconds = gavl_time_to_seconds( m_length_in_gavltime ); //printf("atime=%ld, vtime=%ld, l_in_sec=%f\n", atime, vtime, m_length_in_seconds); } m_pcm_seek = SEEK_NOTHING; m_frame_seek = SEEK_NOTHING; return true; }