video.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package handlers
  2. import (
  3. "net/http"
  4. "sort"
  5. "github.com/owncast/owncast/core/data"
  6. webutils "github.com/owncast/owncast/webserver/utils"
  7. )
  8. type variantsSort struct {
  9. Name string
  10. Index int
  11. VideoBitrate int
  12. IsVideoPassthrough bool
  13. }
  14. type variantsResponse struct {
  15. Name string `json:"name"`
  16. Index int `json:"index"`
  17. }
  18. // GetVideoStreamOutputVariants will return the video variants available.
  19. func GetVideoStreamOutputVariants(w http.ResponseWriter, r *http.Request) {
  20. outputVariants := data.GetStreamOutputVariants()
  21. streamSortVariants := make([]variantsSort, len(outputVariants))
  22. for i, variant := range outputVariants {
  23. variantSort := variantsSort{
  24. Index: i,
  25. Name: variant.GetName(),
  26. IsVideoPassthrough: variant.IsVideoPassthrough,
  27. VideoBitrate: variant.VideoBitrate,
  28. }
  29. streamSortVariants[i] = variantSort
  30. }
  31. sort.Slice(streamSortVariants, func(i, j int) bool {
  32. if streamSortVariants[i].IsVideoPassthrough && !streamSortVariants[j].IsVideoPassthrough {
  33. return true
  34. }
  35. if !streamSortVariants[i].IsVideoPassthrough && streamSortVariants[j].IsVideoPassthrough {
  36. return false
  37. }
  38. return streamSortVariants[i].VideoBitrate > streamSortVariants[j].VideoBitrate
  39. })
  40. response := make([]variantsResponse, len(streamSortVariants))
  41. for i, variant := range streamSortVariants {
  42. variantResponse := variantsResponse{
  43. Index: variant.Index,
  44. Name: variant.Name,
  45. }
  46. response[i] = variantResponse
  47. }
  48. webutils.WriteResponse(w, response)
  49. }