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 ) {
(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);
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: return is_mpeg ? BC_YUV888 : BC_RGB888;
+ case PLAYBACK_X11_XV: return BC_YUV420P;
+ case PLAYBACK_X11_GL: return BC_RGB_FLOAT;
}
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: return BC_RGB888;
+ case PLAYBACK_X11_XV: return BC_YUV420P;
+ case PLAYBACK_X11_GL: return BC_RGB_FLOAT;
+ }
+
+ 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; i<total_files; ++i ) {
+ const char *name = fs.get_entry(i)->get_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)
{