X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;ds=inline;f=application%2Fhelpers%2Fvideo_helper.php;h=aa7c3841c2dd8469234a50c2ef9e7e61bfa84d0a;hb=85ed80e68e49780c162e2985847aca501e70851c;hp=67ede1af76a20112f9249aeafc7dfaf6875c703c;hpb=8b8928b4cc25af9867c397ba5ef4b1129a8df5b5;p=living-lab-site.git
diff --git a/application/helpers/video_helper.php b/application/helpers/video_helper.php
index 67ede1a..aa7c384 100644
--- a/application/helpers/video_helper.php
+++ b/application/helpers/video_helper.php
@@ -100,11 +100,50 @@ function get_closest_res($haystack, $needle, $access_function = NULL)
return $i_min;
}
+/**
+ * "Private" function used by get_av_info which returns the value from a
+ * "key=value" formatted string.
+ *
+ * @param string $str_key_value a string formatted as key=value
+ * @return string
+ */
+function _parse_value($str_key_value)
+{
+ return trim(substr(
+ $str_key_value,
+ strpos($str_key_value, '=') + 1,
+ strlen($str_key_value)
+ ));
+}
+
+/**
+ * Formats the floating number of seconds to a string with format [HH:]mm:ss .
+ *
+ * @param float $secs
+ * @return string
+ */
+function format_duration($secs)
+{
+ $secs = intval(round($secs));
+
+ $h = intval(floor($secs / 3600));
+ $m = intval(floor(($secs % 3600) / 60));
+ $s = $secs % 3600 % 60;
+
+ $duration = sprintf('%02d', $m) . ':' . sprintf('%02d', $s);
+
+ if ($h > 0)
+ return sprintf('%02d', $h) . ':' . $duration;
+
+ return $duration;
+}
+
/**
* Returns information about an Audio/Video file.
*
* @param string $file_name Audio/Video file
- * @return dictionary a dictionary of audio/video properties with keys:
+ * @return dictionary FALSE on error or a dictionary of audio/video properties
+ * with the following keys otherwise:
*
* - width
* - height
@@ -115,10 +154,66 @@ function get_closest_res($haystack, $needle, $access_function = NULL)
*/
function get_av_info($file_name)
{
- // TODO use ffprobe to return width, height, DAR, duration and size of a video
+ $h = popen('ffprobe -show_streams -show_format "'
+ . $file_name . '" 2> /dev/null', 'r');
+
+ $tag = NULL;
+ $codec_type = NULL;
+
+ while ( ($r = fgets($h, 512)) !== FALSE)
+ {
+ // Match tags.
+ if (preg_match('/^\[FORMAT\]/', $r))
+ {
+ $tag = 'FORMAT';
+ continue;
+ }
+ if (preg_match('/^\[STREAM\]/', $r))
+ {
+ $tag = 'STREAM';
+ continue;
+ }
+
+ if ($tag == 'FORMAT')
+ {
+ // Size
+ if (preg_match('/^size=/', $r))
+ $size = intval(_parse_value ($r));
+ }
+
+ if ($tag == 'STREAM')
+ {
+ // Width
+ if (preg_match('/^width=/', $r))
+ $width = intval(_parse_value($r));
+
+ // Height
+ if (preg_match('/^height=/', $r))
+ $height = intval(_parse_value($r));
+
+ // DAR
+ if (preg_match('/^display_aspect_ratio=/', $r))
+ $dar = _parse_value($r);
+
+ // Codec Type
+ if (preg_match('/^codec_type=/', $r))
+ $codec_type = _parse_value($r);
+
+ // Duration
+ if (preg_match('/^duration=/', $r)
+ && strcmp($codec_type, 'video') == 0)
+ $duration = format_duration(floatval(_parse_value($r)));
+ }
+ }
+
+ if (pclose($h) > 0)
+ return FALSE;
+
+ return array('width'=>$width, 'height'=>$height, 'dar'=>$dar,
+ 'duration'=>$duration, 'size'=>$size);
- return array('width'=> 1440, 'height'=> 1080, 'dar'=> '16:9',
- 'duration'=> '00:10', 'size'=> 5568748);
+// return array('width'=> 1440, 'height'=> 1080, 'dar'=> '16:9',
+// 'duration'=> '00:10', 'size'=> 5568748);
}
/**
@@ -172,19 +267,19 @@ function prepare_formats($formats, $av_info, $elim_dupl_res=FALSE)
}
// Eliminate formats with duplicate resolutions.
- if ($elim_dupl_res)
- {
- for ($i = 1; $i < count($transcode_configs); $i++)
- {
- if ($transcode_configs[$i]['v_resolution']
- === $transcode_configs[$i - 1]['v_resolution'])
- {
- unset($transcode_configs[$i - 1]);
- unset($db_formats[$i - 1]);
- $i--;
- }
- }
- }
+// if ($elim_dupl_res)
+// {
+// for ($i = 1; $i < count($transcode_configs); $i++)
+// {
+// if ($transcode_configs[$i]['v_resolution']
+// === $transcode_configs[$i - 1]['v_resolution'])
+// {
+// unset($transcode_configs[$i - 1]);
+// unset($db_formats[$i - 1]);
+// $i--;
+// }
+// }
+// }
return array('transcode_configs'=>$transcode_configs,
'db_formats'=>$db_formats);