diff --git a/inc/lib/webm/ffmpeg.php b/inc/lib/webm/ffmpeg.php index 810c68c1..7eef972c 100644 --- a/inc/lib/webm/ffmpeg.php +++ b/inc/lib/webm/ffmpeg.php @@ -18,7 +18,7 @@ function get_webm_info($filename) { $webminfo['error'] = $validcheck['error']; if (empty($webminfo['error'])) { $trackmap = $validcheck['trackmap']; - $videoidx = $trackmap['videoat'][0]; + $videoidx = $trackmap['videoat'][$validcheck['video_idx']]; $webminfo['width'] = $ffprobe_out['streams'][$videoidx]['width']; $webminfo['height'] = $ffprobe_out['streams'][$videoidx]['height']; $webminfo['duration'] = $ffprobe_out['format']['duration']; @@ -50,19 +50,43 @@ function locate_webm_tracks($ffprobe_out) { } } - return [ 'videoat' => $video_at, 'audioat' => $audio_at, 'others' => $others ]; + return [ 'videoat' => $video_at, 'audioat' => $audio_at ]; } -function is_valid_webm($ffprobe_out) { +/** + * @param string $ffprobe_out + * @return array An array with the following values: + * error: array with error code and message + * trackmap: decoded ffprobe output + * video_idx: int, index of the video track + * audio_idx: ?int, index of the audio track, if present + */ +function is_valid_webm(array $ffprobe_out) { global $config; if (empty($ffprobe_out)) { return [ 'error' => [ 'code' => 1, 'msg' => $config['error']['genwebmerror'] ] ]; } + if ($ffprobe_out['format']['duration'] > $config['webm']['max_length']) { + return [ + 'error' => [ + 'code' => 4, + 'msg' => sprintf($config['error']['webmtoolong'], $config['webm']['max_length']) . 'error 6' + ] + ]; + } + if ((count($ffprobe_out['streams']) > 1) && (!$config['webm']['allow_audio'])) { + return [ + 'error' => [ + 'code' => 3, + 'msg' => $config['error']['webmhasaudio'] . 'error 4' + ] + ]; + } + $trackmap = locate_webm_tracks($ffprobe_out); - // one video track - if (count($trackmap['videoat']) != 1) { + if (count($trackmap['videoat']) < 1) { return [ 'error' => [ 'code' => 2, @@ -70,9 +94,20 @@ function is_valid_webm($ffprobe_out) { ] ]; } - $videoidx = $trackmap['videoat'][0]; + if (count($trackmap['audioat']) != 0 && !$config['webm']['allow_audio']) { + return [ + 'error' => [ + 'code' => 3, + 'msg' => $config['error']['webmhasaudio'] . 'error 5' + ] + ]; + } + + $audio_idx = count($trackmap['audioat']) > 0 ? 0 : null; + $video_idx = 0; + + $extension = \pathinfo($ffprobe_out['format']['filename'], \PATHINFO_EXTENSION); - $extension = pathinfo($ffprobe_out['format']['filename'], PATHINFO_EXTENSION); if ($extension === 'webm' && !stristr($ffprobe_out['format']['format_name'], 'mp4')) { if ($ffprobe_out['format']['format_name'] != 'matroska,webm') { return [ @@ -83,8 +118,28 @@ function is_valid_webm($ffprobe_out) { ]; } } elseif ($extension === 'mp4' || stristr($ffprobe_out['format']['format_name'], 'mp4')) { + $any_h264 = false; + for ($i = 0; $i < count($trackmap['videoat']); $i++) { + if ($ffprobe_out['streams'][$i]['codec_name'] == 'h264') { + $video_idx = $i; + $any_h264 = true; + break; + } + } + + $any_aac = false; + if ($audio_idx !== null) { + for ($i = 0; $i < count($trackmap['audioat']); $i++) { + if ($ffprobe_out['streams'][$i]['codec_name'] == 'h264') { + $audio_idx = $i; + $any_aac = true; + break; + } + } + } + // If the video is not h264 or (there is audio but it's not aac). - if (($ffprobe_out['streams'][$videoidx]['codec_name'] != 'h264') || ((count($trackmap['audioat']) > 0) && ($ffprobe_out['streams'][$trackmap['audioat'][0]]['codec_name'] != 'aac'))) { + if (!$any_h264 || ($audio_idx !== null && !$any_aac)) { return [ 'error' => [ 'code' => 2, @@ -100,33 +155,12 @@ function is_valid_webm($ffprobe_out) { ] ]; } - if ((count($ffprobe_out['streams']) > 1) && (!$config['webm']['allow_audio'])) { - return [ - 'error' => [ - 'code' => 3, - 'msg' => $config['error']['webmhasaudio'] . 'error 4' - ] - ]; - } - if ((count($trackmap['audioat']) > 0) && !$config['webm']['allow_audio']) { - return [ - 'error' => [ - 'code' => 3, - 'msg' => $config['error']['webmhasaudio'] . 'error 5' - ] - ]; - } - if ($ffprobe_out['format']['duration'] > $config['webm']['max_length']) { - return [ - 'error' => [ - 'code' => 4, - 'msg' => sprintf($config['error']['webmtoolong'], $config['webm']['max_length']) . 'error 6' - ] - ]; - } + return [ 'error' => [], - 'trackmap' => $trackmap + 'trackmap' => $trackmap, + 'video_idx' => $video_idx, + 'audio_idx' => $audio_idx ]; }