X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffileffmpeg.C;h=82a810d61794dad65817b130262023ed5d40ea91;hb=af44bff549c39ac8bb6e42a791e7a211e1013526;hp=5542c97587ab7f976e2c57fc38db699917811969;hpb=9dfcb16de981999e51887810e8e4c5cd6e77cde7;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/fileffmpeg.C b/cinelerra-5.1/cinelerra/fileffmpeg.C index 5542c975..82a810d6 100644 --- a/cinelerra-5.1/cinelerra/fileffmpeg.C +++ b/cinelerra-5.1/cinelerra/fileffmpeg.C @@ -210,7 +210,6 @@ int FileFFMPEG::select_video_stream(Asset *asset, int vstream) if( !ff || !asset->video_data ) return 1; asset->width = ff->ff_video_width(vstream); asset->height = ff->ff_video_height(vstream); - asset->video_length = ff->ff_video_frames(vstream); if( (asset->video_length = ff->ff_video_frames(vstream)) < 2 ) asset->video_length = asset->video_length < 0 ? 0 : -1; asset->frame_rate = ff->ff_frame_rate(vstream); @@ -241,6 +240,7 @@ int FileFFMPEG::open_file(int rd, int wr) asset->channels = audio_channels; asset->sample_rate = ff->ff_sample_rate(0); asset->audio_length = ff->ff_audio_samples(0); + strcpy(asset->acodec, ff->ff_audio_format(0)); } int video_layers = ff->ff_total_video_layers(); if( video_layers > 0 ) { @@ -254,6 +254,7 @@ int FileFFMPEG::open_file(int rd, int wr) (asset->video_length = ff->ff_video_frames(0)) < 2 ) asset->video_length = asset->video_length < 0 ? 0 : -1; if( !asset->frame_rate ) asset->frame_rate = ff->ff_frame_rate(0); + strcpy(asset->vcodec, ff->ff_video_format(0)); } IndexState *index_state = asset->index_state; index_state->read_markers(file->preferences->index_directory, asset->path); @@ -334,38 +335,48 @@ int FileFFMPEG::colormodel_supported(int colormodel) return colormodel; } -int FileFFMPEG::get_best_colormodel(Asset *asset, int driver) + +int FileFFMPEG::get_best_colormodel(int driver, int vstream) { + if( vstream < 0 ) vstream = 0; + int is_mpeg = !ff ? 0 : ff->ff_video_mpeg_color_range(vstream); + switch(driver) { case PLAYBACK_X11: - return BC_RGB888; - case PLAYBACK_X11_XV: - case PLAYBACK_ASYNCHRONOUS: - return BC_YUV888; - case PLAYBACK_X11_GL: - return BC_YUV888; - case PLAYBACK_DV1394: - case PLAYBACK_FIREWIRE: - return BC_YUV422P; - case VIDEO4LINUX2: - return BC_RGB888; - case VIDEO4LINUX2JPEG: - return BC_COMPRESSED; - case CAPTURE_DVB: - case VIDEO4LINUX2MPEG: - return BC_YUV422P; - case CAPTURE_JPEG_WEBCAM: - return BC_COMPRESSED; - case CAPTURE_YUYV_WEBCAM: - return BC_YUV422; - case CAPTURE_FIREWIRE: - case CAPTURE_IEC61883: - return BC_YUV422P; + case PLAYBACK_X11_GL: return is_mpeg ? BC_YUV888 : BC_RGB888; + case PLAYBACK_X11_XV: return BC_YUV420P; } return BC_RGB888; } +int FileFFMPEG::get_best_colormodel(Asset *asset, int driver) +{ + switch(driver) { +// the direct X11 color model requires scaling in the codec + case PLAYBACK_X11: + case PLAYBACK_X11_GL: return BC_RGB888; + case PLAYBACK_X11_XV: return BC_YUV420P; + } + + return BC_YUV420P; +} + +int FileFFMPEG::can_render(const char *fformat, const char *type) +{ + FileSystem fs; + char option_path[BCTEXTLEN]; + FFMPEG::set_option_path(option_path, type); + fs.update(option_path); + int total_files = fs.total_files(); + for( int i=0; iget_name(); + const char *ext = strrchr(name,'.'); + if( !ext ) continue; + if( !strcmp(fformat, ++ext) ) return 1; + } + return 0; +} int FileFFMPEG::get_ff_option(const char *nm, const char *options, char *value) {