video.go 1.5 KB

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