Changeset 165616 in webkit


Ignore:
Timestamp:
Mar 14, 2014 7:36:18 AM (10 years ago)
Author:
Andres Gomez
Message:

[GStreamer] WebKit gets stalled when trying to play a stream
https://bugs.webkit.org/show_bug.cgi?id=125926

Reviewed by Philippe Normand.

Added new test for checking the playback on Icecast/Shoutcast
streamed media.

  • http/tests/media/media-play-stream-chunked-icy-expected.txt: Added.
  • http/tests/media/media-play-stream-chunked-icy.html: Added.
  • http/tests/media/resources/create-id3-db.php: Added.
  • http/tests/media/resources/serve-video.php: Added support for

chunked streams and Icecast/Shoutcast headers.

  • http/tests/resources/dir-helpers.php: Added.
  • http/tests/resources/portabilityLayer.php: Added a couple of new

fallback functions when they are not available in old PHP
versions.

  • media/content/metadata.db: Added.
  • media/content/silence.mp3: Added.
  • platform/mac/TestExpectations: Skipped on Mavericks Mac port.
Location:
trunk/LayoutTests
Files:
6 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r165615 r165616  
     12014-03-14  Andres Gomez  <agomez@igalia.com>
     2
     3        [GStreamer] WebKit gets stalled when trying to play a stream
     4        https://bugs.webkit.org/show_bug.cgi?id=125926
     5
     6        Reviewed by Philippe Normand.
     7
     8        Added new test for checking the playback on Icecast/Shoutcast
     9        streamed media.
     10
     11        * http/tests/media/media-play-stream-chunked-icy-expected.txt: Added.
     12        * http/tests/media/media-play-stream-chunked-icy.html: Added.
     13        * http/tests/media/resources/create-id3-db.php: Added.
     14        * http/tests/media/resources/serve-video.php: Added support for
     15        chunked streams and Icecast/Shoutcast headers.
     16        * http/tests/resources/dir-helpers.php: Added.
     17        * http/tests/resources/portabilityLayer.php: Added a couple of new
     18        fallback functions when they are not available in old PHP
     19        versions.
     20        * media/content/metadata.db: Added.
     21        * media/content/silence.mp3: Added.
     22        * platform/mac/TestExpectations: Skipped on Mavericks Mac port.
     23
    1242014-03-14  Mihnea Ovidenie  <mihnea@adobe.com>
    225
  • trunk/LayoutTests/http/tests/media/resources/serve-video.php

    r165569 r165616  
    11<?php
    22
     3    // This script is based on the work done by gadgetguru
     4    // <david@vuistbijl.nl> at
     5    // https://github.com/gadgetguru/PHP-Streaming-Audio and released
     6    // under the Public Domain.
     7
     8    // Set variables
     9    $settings = array(
     10        "chunkSize" => 1024 * 256,
     11        "databaseFile" => "metadata.db",
     12        "httpStatus" => "500 Internal Server Error",
     13        "mediaDirectory" => array_key_exists("name", $_GET) ? dirname($_GET["name"]) : "",
     14        "mimeType" => array_key_exists("type", $_GET) ? $_GET["type"] : "",
     15        "radioGenre" => "Rock",
     16        "radioName" => "WebKit Test Radio",
     17        "radioUrl" => (array_key_exists("HTTPS", $_SERVER) ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"],
     18        "setContentLength" => array_key_exists("content-length", $_GET) ? $_GET["content-length"] : "yes",
     19        "setIcyData" => array_key_exists("icy-data", $_GET) ? $_GET["icy-data"] : "no",
     20        "supportRanges" => array_key_exists("ranges", $_GET) ? $_GET["ranges"] : "yes",
     21    );
     22
     23    // 500 on errors
     24    if (!array_key_exists("name", $_GET)) {
     25        trigger_error("You have not specified a 'name' parameter.", E_USER_WARNING);
     26        goto answering;
     27    }
    328    $fileName = $_GET["name"];
    4     $type = $_GET["type"];
    5     if (array_key_exists("ranges", $_GET))
    6         $ranges = $_GET["ranges"];
    729
     30    if (!file_exists($fileName)) {
     31        trigger_error("The file to stream specified at 'name' doesn't exist.", E_USER_WARNING);
     32        goto answering;
     33    }
     34    $settings["databaseFile"] = $settings["mediaDirectory"] . "/" . $settings["databaseFile"];
     35
     36    if ($settings["setIcyData"] != "yes" && $settings["mimeType"] == "") {
     37        trigger_error("You have not specified a 'type' parameter.", E_USER_WARNING);
     38        goto answering;
     39    }
     40
     41    if ($settings["setIcyData"] == "yes") {
     42        if (!file_exists($settings["databaseFile"])) {
     43
     44            // If the metadata database file doesn't exist it has to
     45            // be create previously.
     46            //
     47            // Check the instructions about how to create it from the
     48            // create-id3-db.php script file in this same directory.
     49
     50            trigger_error("The metadata database doesn't exist. To create one, check the script 'create-id3-db.php'.", E_USER_WARNING);
     51            goto answering;
     52        }
     53
     54        $playFiles = unserialize(file_get_contents($settings["databaseFile"]));
     55        foreach ($playFiles as $i=>$playFile) {
     56            if (basename($fileName) == $playFile["fileName"]) {
     57                $fileInDB = true;
     58                break;
     59            }
     60        }
     61
     62        if (!isset($fileInDB)) {
     63            trigger_error("The requested file is not in the database.", E_USER_WARNING);
     64            goto answering;
     65        }
     66    }
     67
     68    // There is everything needed to send the media file
    869    $fileSize = filesize($fileName);
    970    $start = 0;
    1071    $end = $fileSize - 1;
    11     if ($ranges != "no")
     72    if ($settings["supportRanges"] != "no" && array_key_exists("HTTP_RANGE", $_SERVER))
    1273        $contentRange = $_SERVER["HTTP_RANGE"];
    1374    if (isset($contentRange)) {
     
    1677        if (!empty($range[1]))
    1778            $end = intval($range[1]);
    18         $httpStatus = "206 Partial Content";
     79        $settings["httpStatus"] = "206 Partial Content";
    1980    } else
    20         $httpStatus = "200 OK";
     81        $settings["httpStatus"] = "200 OK";
    2182
    22     header("Status: " . $httpStatus);
    23     header("HTTP/1.1 " . $httpStatus);
     83
     84answering:
     85
     86    header("Status: " . $settings["httpStatus"]);
     87    header("HTTP/1.1 " . $settings["httpStatus"]);
     88    header("Connection: close");
     89
     90    if ($settings["httpStatus"] == "500 Internal Server Error") {
     91        header("Content-Type: text/html");
     92        $errorMessage = sprintf("<html><body><h1>%s</h1><p/>",
     93                                $settings["httpStatus"]);
     94        if (function_exists("error_get_last")) {
     95            $errorArray = error_get_last();
     96            if ($errorArray) {
     97                $errorMessage = sprintf("%sError type: %d<p/>Error message: %s<p/>".
     98                    "Error file: %s<p/>Error line: %d<p/>",
     99                    $errorMessage, $errorArray["type"], $errorArray["message"],
     100                    $errorArray["file"], $errorArray["line"]);
     101            }
     102        }
     103        $errorMessage = $errorMessage . "</body><html>";
     104        print($errorMessage);
     105        flush();
     106        exit;
     107    }
     108
    24109    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    25110    header("Pragma: no-cache");
    26111    header("Etag: " . '"' . $fileSize . "-" . filemtime($fileName) . '"');
    27     header("Content-Type: " . $type);
    28     if ($ranges != "no")
     112    if ($settings["setIcyData"] == "yes") {
     113        $bitRate = ceil($playFiles[$i]["bitRate"] / 1000);
     114        if ($settings["mimeType"] == "")
     115            $settings["mimeType"] = $playFiles[$i]["mimeType"];
     116        header("icy-notice1: <BR>This stream requires a shoutcast/icecast compatible player.<BR>");
     117        header("icy-notice2: WebKit Stream Test<BR>");
     118        header("icy-name: " . $settings["radioName"]);
     119        header("icy-genre: " . $settings["radioGenre"]);
     120        header("icy-url: " . $settings["radioUrl"]);
     121        header("icy-pub: 1");
     122        header("icy-br: " . $bitRate);
     123    }
     124    header("Content-Type: " . $settings["mimeType"]);
     125    if ($settings["supportRanges"] != "no")
    29126        header("Accept-Ranges: bytes");
    30     header("Content-Length: " . ($end - $start + 1));
     127    if ($settings["setContentLength"] != "no")
     128        header("Content-Length: " . ($end - $start + 1));
    31129    if (isset($contentRange))
    32130        header("Content-Range: bytes " . $start . "-" . $end . "/" . $fileSize);
    33     header("Connection: close");
    34131
    35     $chunkSize = 1024 * 256;
    36132    $offset = $start;
    37133
     
    40136
    41137    while (!feof($fn) && $offset <= $end && connection_status() == 0) {
    42         $readSize = min($chunkSize, ($end - $offset) + 1);
     138        $readSize = min($settings["chunkSize"], ($end - $offset) + 1);
    43139        $buffer = fread($fn, $readSize);
    44140        print($buffer);
    45141        flush();
    46         $offset += $chunkSize;
     142        $offset += $settings["chunkSize"];
    47143    }
    48144    fclose($fn);
  • trunk/LayoutTests/http/tests/resources/portabilityLayer.php

    r165569 r165616  
    3333}
    3434
     35if (!function_exists('stream_copy_to_stream')) {
     36    function stream_copy_to_stream($source, $dest)
     37    {
     38        $result = 0;
     39        while (!feof($source)) {
     40            $bytesWritten = fwrite($dest, fread($source, 8192));
     41            if (!$bytesWritten)
     42                return FALSE;
     43            $result = $result + $bytesWritten;
     44        }
     45
     46        return $result;
     47    }
     48}
     49
     50if (!function_exists('scandir')) {
     51    function scandir($dir)
     52    {
     53        if (!is_dir($dir))
     54            return FALSE;
     55
     56        $dh = opendir($dir);
     57        while ($filename = readdir($dh)) {
     58            $files[] = $filename;
     59        }
     60
     61        closedir($dh);
     62        sort($files);
     63
     64        return $files;
     65    }
     66}
     67
    3568?>
  • trunk/LayoutTests/platform/mac/TestExpectations

    r165436 r165616  
    560560media/media-fullscreen-not-in-document.html
    561561
     562webkit.org/b/130234 [ Mavericks ] http/tests/media/media-play-stream-chunked-icy.html [ Skip ]
     563
    562564# Media playback control is passed to AVFoundation that doesn't like fancy PHP URLs like the one used in the test and, in addition, they won't care about HTTP servers not supporting "Range" requests
    563565http/tests/media/media-seeking-no-ranges-server.html
Note: See TracChangeset for help on using the changeset viewer.