Skip to content

Commit

Permalink
fix: Add basic cmaf support. (#31)
Browse files Browse the repository at this point in the history
  • Loading branch information
cjpillsbury committed Feb 16, 2024
1 parent f03a419 commit efdeee0
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import MuxPlayerSwift

class ExperimentalCacheViewController: UIViewController {

var playbackID: String = "a4nOgmxGWg6gULfcBbAa00gXyfcwPnAFldF8RdsNyk8M"
// var playbackID: String = "a4nOgmxGWg6gULfcBbAa00gXyfcwPnAFldF8RdsNyk8M" // Playback ID w/TS
var playbackID: String = "u1v00DuRr01bjKb01E8TEFgBfDDggNLWYSk" // Playback ID w/CMAF

lazy var topPlayerViewController = AVPlayerViewController(
playbackID: playbackID,
Expand Down
126 changes: 124 additions & 2 deletions Sources/MuxPlayerSwift/ReverseProxyServer/ReverseProxyServer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ class ReverseProxyServer {
}

self.setupManifestRequestHandler()
self.setupSegmentHandler()
self.setupCMAFSegmentHandler()
self.setupTSSegmentHandler()

webServer.start(
withPort: port,
Expand Down Expand Up @@ -232,7 +233,7 @@ class ReverseProxyServer {

}

private func setupSegmentHandler() {
private func setupTSSegmentHandler() {
self.webServer.addHandler(
forMethod: "GET",
pathRegex: "^/.*\\.ts$",
Expand Down Expand Up @@ -352,4 +353,125 @@ class ReverseProxyServer {
}
}
}

private func setupCMAFSegmentHandler() {
self.webServer.addHandler(
forMethod: "GET",
pathRegex: "^/.*\\.m4s$",
request: GCDWebServerRequest.self
) { [weak self] request, completion in

guard let self = self else {
return completion(GCDWebServerDataResponse(statusCode: 500))
}

guard let originURL = self.originURL(from: request) else {
return completion(GCDWebServerErrorResponse(statusCode: 400))
}

eventRecorder.didRecord(
event: ReverseProxyEvent(
originURL: originURL,
kind: .segmentRequestReceived
)
)

var reverseProxyRequest = URLRequest(url: originURL)
reverseProxyRequest.httpMethod = "GET"

// Construct a modified request that will be the
// same across segment requests
// - Remove query parameters
// - Replace cdn-specific hosts with generic
//
// This request only used as a cache key
var components = URLComponents(url: originURL, resolvingAgainstBaseURL: false)
components?.queryItems = nil
components?.host = "stream.mux.com"

var strippedRequest = URLRequest(url: components!.url!)

Check warning on line 392 in Sources/MuxPlayerSwift/ReverseProxyServer/ReverseProxyServer.swift

View workflow job for this annotation

GitHub Actions / Run Unit Tests

variable 'strippedRequest' was never mutated; consider changing to 'let' constant

if let cachedResponse = self.segmentCache.cachedResponse(
for: strippedRequest
) {

eventRecorder.didRecord(
event: ReverseProxyEvent(
originURL: originURL,
kind: .segmentCacheHit(key: strippedRequest)
)
)

let contentType = cachedResponse.response.mimeType ?? "video/mp4"

completion(
GCDWebServerDataResponse(
data: cachedResponse.data,
contentType: contentType
)
)
} else {

eventRecorder.didRecord(
event: ReverseProxyEvent(
originURL: originURL,
kind: .segmentCacheMiss(key: strippedRequest)
)
)

let task = self.session.dataTask(
with: reverseProxyRequest
) { [weak self] data, response, error in

guard let self = self else {
completion(
GCDWebServerErrorResponse(
statusCode: 400
)
)
return
}

guard let data = data, let response = response else {
return completion(GCDWebServerErrorResponse(statusCode: 500))
}

let contentType = response.mimeType ?? "video/mp4"
completion(
GCDWebServerDataResponse(
data: data,
contentType: contentType
)
)

let cachedURLResponse = CachedURLResponse(
response: response,
data: data
)

self.segmentCache.storeCachedResponse(
cachedURLResponse,
for: strippedRequest
)

let segmentSizeInBytes = data.count

let cacheDiskUsageInBytes = self.segmentCache.currentDiskUsage

self.eventRecorder.didRecord(
event: ReverseProxyEvent(
originURL: originURL,
kind: .segmentCacheStored(
key: strippedRequest,
cacheDiskUsageInBytes: cacheDiskUsageInBytes,
segmentSizeInBytes: segmentSizeInBytes
)
)
)
}

task.resume()
}
}
}
}

0 comments on commit efdeee0

Please sign in to comment.