From f005859eec16dad0594bedd9593a8537bbda6e1b Mon Sep 17 00:00:00 2001 From: Heshan Wanigasooriya Date: Mon, 21 Feb 2011 09:31:51 +0000 Subject: Adding dependencies on the Preset module and added all presets are editable from the admin interface --- includes/preset.inc | 98 ++++--------- includes/video.preset.inc | 357 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 381 insertions(+), 74 deletions(-) create mode 100644 includes/video.preset.inc (limited to 'includes') diff --git a/includes/preset.inc b/includes/preset.inc index 1b0f6c4..fe9a7e4 100644 --- a/includes/preset.inc +++ b/includes/preset.inc @@ -9,47 +9,32 @@ class video_preset { - private $presets; + private $preset; public function __construct($preset = null) { - $this->presets = $preset; + $this->preset = $preset; if (!isset($preset)) - $this->presets = variable_get('vid_preset', ''); -//get our configured transcoder. -// if (!isset($preset)) -// $preset = variable_get('vid_preset', 'flash_hq'); -// echo print_r($preset); -// if (!module_load_include('inc', 'video', '/video_preset/' . $preset)) { -// $modules = module_list(); -// foreach ($modules as $module) { -// $mobule_files = array(); -// $module_path = drupal_get_path('module', $module) . '/video_preset'; -// $mobule_files = file_scan_directory($module_path, '^.*\.inc$'); -// if (is_array($mobule_files)) { -// foreach ($mobule_files as $file) { -// if ($file->name == $preset) -// require_once $file->filename; -// } -// } -//// -// } -// } -// if (class_exists($preset)) { -// $this->preset = new $preset; -// } else { -// drupal_set_message(t('The preset is not configured properly.'), 'error'); -// } + $this->preset = variable_get('video_preset', array()); } + /** + * Show admin settings + * @return array $form + */ public function admin_settings() { + $presets = preset_get_presets('video'); + $preset = array(); + foreach ($presets as $id => $value) { + $preset[$id] = $value['name']; + $help[] = $value['name'] . ' - ' . $value['description'] . ' ' . l(t('edit'), preset_get_preset_path('video', $value['name'])); + } $form = array(); - $options = $this->_preset(); - $form['vid_preset'] = array( + $form['video_preset'] = array( '#type' => 'checkboxes', '#title' => t('Video transcode presets'), - '#options' => $options['radios'], - '#default_value' => variable_get('vid_preset', array('status', 'promote')), - '#description' => t('!list', array('!list' => theme('item_list', $options['help']))), + '#options' => $preset, + '#default_value' => variable_get('video_preset', array()), + '#description' => t('!list', array('!list' => theme('item_list', array('items' => $help)))), '#prefix' => '
', '#suffix' => '
', ); @@ -57,50 +42,15 @@ class video_preset { return $form; } - private function _preset($presets = null) { -// @TDOO : Observer will match in this case - $files = array(); -// Lets find our transcoder classes and build our radio options -// We do this by scanning our transcoders folder - $form = array('radios' => array(), 'help' => array(), 'properties' => array()); - $path = drupal_get_path('module', 'video') . '/video_preset'; - $files = file_scan_directory($path, '/.*\.inc/'); -// check inside sub modules - $modules = module_list(); - foreach ($modules as $module) { - $mobule_files = array(); - $module_path = drupal_get_path('module', $module) . '/video_preset'; - $mobule_files = file_scan_directory($module_path, '/.*\.inc/'); - $files = array_merge($files, $mobule_files); - } - - foreach ($files as $file) { - if (!module_load_include('inc', 'video', '/video_preset/' . $file->name)) - require_once $file->filename; - $focus = new $file->name; - $form['radios'][$focus->get_value()] = $focus->get_name(); - $form['help'][] = $focus->get_help(); -// $form['admin_settings'] = $form['admin_settings'] + $focus->admin_settings(); - if (is_array($presets) && !empty($presets[$focus->get_value()])) - $form['properties'][$focus->get_value()] = $focus->get_properties(); -// echo $focus->get_value(); - } - return $form; - } - + /** + * Get the preset properties + * @return array $properties + */ public function properties() { - $presets = $this->presets; - $options = $this->_preset($presets); + $preset = $this->preset; return $options['properties']; + if (preset_exists('video', $preset)) + preset_get_settings($preset); } -} - -interface video_preset_interface { - - public function get_name(); - - public function get_help(); - - public function get_properties(); } \ No newline at end of file diff --git a/includes/video.preset.inc b/includes/video.preset.inc new file mode 100644 index 0000000..0c12bcd --- /dev/null +++ b/includes/video.preset.inc @@ -0,0 +1,357 @@ + - The form elements that you would like to add for the settings. + * + * Special Note: It is required to structure all your settings using + * $form['preset']['settings'] as the parent form element. Otherwise, + * they will not get serialized within the "settings" column of the database. + * @TODO : we can add some required values there + */ +function video_preset_create_form() { + $form = array(); + return $form; +} + +/** + * This is used to add all the other settings that you need to declare in your preset. + * The preset object is passed to this form, so you can use that data to populate the default values + * for your form elements by using $preset['settings']['param2']. + * + * @param - The preset object. + * @return - The additional form settings that you would like to add to your preset. + */ +function video_preset_form($preset) { + $form = array(); + $form['preset']['settings']['device_profile'] = array( + '#type' => 'fieldset', + '#title' => t('Output parameter'), + '#description' => t('All output settings are optional. We choose sensible defaults for web and iPhone playback.'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['device_profile']['device_profile'] = array( + '#type' => 'select', + '#title' => t('Device profile'), + '#description' => t('A profile for your target device.'), + '#options' => array( + '0' => 'None', + 'mobile/advanced' => 'mobile/advanced', + 'mobile/baseline' => 'mobile/baseline', + 'mobile/legacy' => 'mobile/legacy', + 'v1/mobile/advanced' => 'v1/mobile/advanced', + 'v1/mobile/baseline' => 'v1/mobile/baseline', + 'v1/mobile/legacy' => 'v1/mobile/legacy', + 'v2/mobile/legacy' => 'v2/mobile/legacy' + ), + '#default_value' => (!empty($preset['settings']['device_profile'])) ? $preset['settings']['device_profile'] : 0 + ); + // video settings + $form['preset']['settings']['video'] = array( + '#type' => 'fieldset', + '#title' => t('Video settings'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['video']['video_codec'] = array( + '#type' => 'select', + '#title' => t('Video codec'), + '#description' => t('The video codec used in the video file can affect the ability to play the video on certain devices. The default codec used is H.264.'), + '#options' => array( + 'h264' => 'H.264 (default)', + 'vp8' => 'VP8', + 'theora' => 'Theora', + 'vp6' => 'VP6', + 'mpeg4' => 'MPEG-4', + 'wmv' => 'WMV' + ), + '#default_value' => (!empty($preset['settings']['video_codec'])) ? $preset['settings']['video_codec'] : 'h264' + ); + $form['preset']['settings']['video']['video_quality'] = array( + '#type' => 'select', + '#title' => t('Video quality'), + '#description' => t('A target video quality. Affects bitrate and file size.'), + '#options' => array( + '1 - Poor quality (smaller file)', + '2', + '3 (default)', + '4', + '5 - High quality (larger file)' + ), + '#default_value' => (!empty($preset['settings']['video_quality'])) ? $preset['settings']['video_quality'] : 2 + ); + $form['preset']['settings']['video']['video_speed'] = array( + '#type' => 'select', + '#title' => t('Video speed'), + '#description' => t('Speed of encoding. Affects compression.'), + '#options' => array( + '1 - Slow (better compression)', + '2', + '3 (default)', + '4', + '5 - Fast (worse compression)' + ), + '#default_value' => (!empty($preset['settings']['video_speed'])) ? $preset['settings']['video_speed'] : 2 + ); + $form['preset']['settings']['video']['width'] = array( + '#type' => 'textfield', + '#title' => t('Width'), + '#description' => t('The maximum width of the output video (in pixels).'), + '#default_value' => !empty($preset['settings']['width']) ? $preset['settings']['width'] : '' + ); + $form['preset']['settings']['video']['height'] = array( + '#type' => 'textfield', + '#title' => t('Height'), + '#description' => t('The maximum height of the output video (in pixels).'), + '#default_value' => !empty($preset['settings']['height']) ? $preset['settings']['height'] : '' + ); + $form['preset']['settings']['video']['video_aspectmode'] = array( + '#type' => 'select', + '#title' => t('Aspect mode'), + '#description' => t('What to do when aspect ratio of input file does not match the target width/height aspect ratio.'), + '#options' => array( + 'preserve' => 'Preserve aspect ratio (default)', + 'crop' => 'Crop to fit output aspect ratio', + 'pad' => 'Pad (letterbox) to fit output aspect ratio', + 'stretch' => 'Stretch (distort) to output aspect ratio' + ), + '#default_value' => (!empty($preset['settings']['video_aspectmode'])) ? $preset['settings']['video_aspectmode'] : 'preserve' + ); + $form['preset']['settings']['video']['video_upscale'] = array( + '#type' => 'checkbox', + '#title' => t('Upscale'), + '#description' => t('If the input file is smaller than the target output, should the file be upscaled to the target size?'), + '#default_value' => !empty($preset['settings']['video_upscale']) ? $preset['settings']['video_upscale'] : '' + ); + // audio settings + $form['preset']['settings']['audio'] = array( + '#type' => 'fieldset', + '#title' => t('Audio settings'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['audio']['audio_codec'] = array( + '#type' => 'select', + '#title' => t('Audio codec'), + '#description' => t('The audio codec to be used.'), + '#options' => array( + 'aac' => 'AAC (default for most cases)', + 'mp3' => 'MP3', + 'vorbis' => 'Vorbis (default for VP8 and Theora)', + 'wma' => 'WMA' + ), + '#default_value' => (!empty($preset['settings']['audio_codec'])) ? $preset['settings']['audio_codec'] : 'h264' + ); + $form['preset']['settings']['audio']['audio_quality'] = array( + '#type' => 'select', + '#title' => t('Audio quality'), + '#description' => t('A target audio quality. Affects bitrate and file size.'), + '#options' => array( + '1 - Poor quality (smaller file)', + '2', + '3 (default)', + '4', + '5 - High quality (larger file)' + ), + '#default_value' => (!empty($preset['settings']['audio_quality'])) ? $preset['settings']['audio_quality'] : 2 + ); + // advanced video settings + $form['preset']['settings']['adv_video'] = array( + '#type' => 'fieldset', + '#title' => t('Advanced video settings'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['adv_video']['deinterlace'] = array( + '#type' => 'select', + '#title' => t('Deinterlace'), + '#description' => t('Note that detect mode will auto-detect and deinterlace interlaced content.'), + '#options' => array( + 'detect' => 'Detect (default)', + 'on' => 'On (reduces quality of non-interlaced content)', + 'off' => 'Off' + ), + '#default_value' => (!empty($preset['settings']['deinterlace'])) ? $preset['settings']['deinterlace'] : 'detect' + ); + $form['preset']['settings']['adv_video']['max_frame_rate'] = array( + '#type' => 'textfield', + '#title' => t('Maximum frame rate'), + '#description' => t('A maximum frame rate cap (in frames per second).'), + '#default_value' => !empty($preset['settings']['max_frame_rate']) ? $preset['settings']['max_frame_rate'] : '' + ); + $form['preset']['settings']['adv_video']['frame_rate'] = array( + '#type' => 'textfield', + '#title' => t('Frame rate'), + '#description' => t('Force a specific output frame rate (in frames per second). For best quality, do not use this setting.'), + '#default_value' => !empty($preset['settings']['frame_rate']) ? $preset['settings']['frame_rate'] : '' + ); + $form['preset']['settings']['adv_video']['frame_rate'] = array( + '#type' => 'textfield', + '#title' => t('Frame rate'), + '#description' => t('Force a specific output frame rate (in frames per second). For best quality, do not use this setting.'), + '#default_value' => !empty($preset['settings']['frame_rate']) ? $preset['settings']['frame_rate'] : '' + ); + $form['preset']['settings']['adv_video']['video_bitrate'] = array( + '#type' => 'textfield', + '#title' => t('Video bitrate'), + '#description' => t('A target bitrate in kbps. Not necessary if you select a Video Quality setting, unless you want to target a specific bitrate.'), + '#default_value' => !empty($preset['settings']['video_bitrate']) ? $preset['settings']['video_bitrate'] : '' + ); + $form['preset']['settings']['adv_video']['bitrate_cap'] = array( + '#type' => 'textfield', + '#title' => t('Bitrate cap'), + '#description' => t('A bitrate cap in kbps, used for streaming servers.'), + '#default_value' => !empty($preset['settings']['bitrate_cap']) ? $preset['settings']['bitrate_cap'] : '' + ); + $form['preset']['settings']['adv_video']['buffer_size'] = array( + '#type' => 'textfield', + '#title' => t('Buffer size'), + '#description' => t('The buffer size for the bitrate cap in kbps.'), + '#default_value' => !empty($preset['settings']['buffer_size']) ? $preset['settings']['buffer_size'] : '' + ); + $form['preset']['settings']['adv_video']['one_pass'] = array( + '#type' => 'checkbox', + '#title' => t('One pass'), + '#description' => t('Force one-pass encoding when targeting a specific video_bitrate. True or False.'), + '#default_value' => !empty($preset['settings']['one_pass']) ? $preset['settings']['one_pass'] : '' + ); + $form['preset']['settings']['adv_video']['skip_video'] = array( + '#type' => 'checkbox', + '#title' => t('Skip video'), + '#description' => t('The video track will be omitted from the output. You can still specify a video format, however, no video track will be present in the resulting file.'), + '#default_value' => !empty($preset['settings']['skip_video']) ? $preset['settings']['skip_video'] : '' + ); + // advanced audio settings + $form['preset']['settings']['adv_audio'] = array( + '#type' => 'fieldset', + '#title' => t('Advanced audio settings'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['adv_audio']['audio_bitrate'] = array( + '#type' => 'textfield', + '#title' => t('Audio bitrate'), + '#description' => t('The overall audio bitrate specified as kilobits per second (kbps, e.g. 96 or 160). This value can\'t exceed 160 kbps per channel. 96-160 is usually a good range for stereo output.'), + '#default_value' => !empty($preset['settings']['audio_bitrate']) ? $preset['settings']['audio_bitrate'] : '' + ); + $form['preset']['settings']['adv_audio']['audio_channels'] = array( + '#type' => 'select', + '#title' => t('Audio channels'), + '#description' => t('By default we will choose the lesser of the number of audio channels in the input file or 2 (stereo).'), + '#options' => array( + 1 => '1 - Mono', + 2 => '2 - Stereo (default)' + ), + '#default_value' => (!empty($preset['settings']['audio_channels'])) ? $preset['settings']['audio_channels'] : 2 + ); + $form['preset']['settings']['adv_audio']['audio_sample_rate'] = array( + '#type' => 'textfield', + '#title' => t('Audio sample rate'), + '#description' => t('The sample rate of the audio in hertz. Manually setting this may cause problems, depending on the selected bitrate and number of channels.'), + '#default_value' => !empty($preset['settings']['audio_sample_rate']) ? $preset['settings']['audio_sample_rate'] : '' + ); + $form['preset']['settings']['adv_audio']['skip_audio'] = array( + '#type' => 'checkbox', + '#title' => t('Skip audio'), + '#description' => t('The audio track will be omitted from the output. You must specify a video format and no audio track will be present in the resulting file.'), + '#default_value' => !empty($preset['settings']['skip_audio']) ? $preset['settings']['skip_audio'] : '' + ); + // video optimizations + $form['preset']['settings']['vid_optimization'] = array( + '#type' => 'fieldset', + '#title' => t('Video Optimization'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['vid_optimization']['autolevels'] = array( + '#type' => 'checkbox', + '#title' => t('Autolevels'), + '#description' => t('Automatic brightness / contrast correction.'), + '#default_value' => !empty($preset['settings']['autolevels']) ? $preset['settings']['autolevels'] : '' + ); + $form['preset']['settings']['vid_optimization']['deblock'] = array( + '#type' => 'checkbox', + '#title' => t('Deblock'), + '#description' => t('Apply deblocking filter. Useful for highly compressed or blocky input videos.'), + '#default_value' => !empty($preset['settings']['deblock']) ? $preset['settings']['deblock'] : '' + ); + $form['preset']['settings']['vid_optimization']['denoise'] = array( + '#type' => 'select', + '#title' => t('Denoise'), + '#description' => t('Apply denoise filter. Generally results in slightly better compression, and slightly slower encoding. Beware of any value higher than "Weak" (unless you\'re encoding animation).'), + '#options' => array( + 0 => 'None', + 'weak' => 'Weak - usually OK for general use', + 'medium' => 'Medium', + 'strong' => 'Strong - beware', + 'strongest' => 'Strongest - beware, except for Anime' + ), + '#default_value' => (!empty($preset['settings']['denoise'])) ? $preset['settings']['denoise'] : 2 + ); + // Segmented Streaming + $form['preset']['settings']['segmented_streaming'] = array( + '#type' => 'fieldset', + '#title' => t('Segmented Streaming'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['segmented_streaming']['segmented_type'] = array( + '#type' => 'select', + '#title' => t('Type'), + '#description' => t('Set to segmented for HTTP Live Streaming.'), + '#options' => array( + 0 => 'Standard', + 'segmented' => 'segmented' + ), + '#default_value' => (!empty($preset['settings']['segmented_type'])) ? $preset['settings']['segmented_type'] : 0 + ); + $form['preset']['settings']['segmented_streaming']['segmented_seconds'] = array( + '#type' => 'textfield', + '#title' => t('Segment Seconds'), + '#description' => t('The maximum duration of each segment in segmented outputs.'), + '#default_value' => !empty($preset['settings']['segmented_seconds']) ? $preset['settings']['segmented_seconds'] : '' + ); + // Create clip + $form['preset']['settings']['create_clip'] = array( + '#type' => 'fieldset', + '#title' => t('Create Clip'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['preset']['settings']['create_clip']['clip_start'] = array( + '#type' => 'textfield', + '#title' => t('Start clip'), + '#description' => t('The starting point of a subclip (in timecode or number of seconds).'), + '#default_value' => !empty($preset['settings']['clip_start']) ? $preset['settings']['clip_start'] : '' + ); + $form['preset']['settings']['create_clip']['clip_length'] = array( + '#type' => 'textfield', + '#title' => t('Clip length '), + '#description' => t('The length of the subclip (in timecode or number of seconds).'), + '#default_value' => !empty($preset['settings']['clip_length']) ? $preset['settings']['clip_length'] : '' + ); + // Command line parameters + $form['preset']['settings']['command_line'] = array( + '#type' => 'fieldset', + '#title' => t('Command line options'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $tokes = array( + '!cmd_path - Path to transcoder', + '!videofile - Input video file', + '!convertfile - Output video file', + '!width - Width of output video', + '!height - Height of output video' + ); + $form['preset']['settings']['command_line']['cli_code'] = array( + '#type' => 'textarea', + '#title' => t('Command line codes to run'), + '#description' => t('Please add command line codes each to run separated by a new line.') . theme('item_list', array('items' => $tokes, 'title' => 'Available Tokes')), + '#default_value' => !empty($preset['settings']['cli_code']) ? $preset['settings']['cli_code'] : '!cmd_path -i !videofile -s !widthx!height -r 15 -b 250 -ar 22050 -ab 48 !convertfile' + ); + return $form; +} \ No newline at end of file -- cgit v1.2.3