Dolby.io · Arazzo Workflow

Dolby OptiView Attach Ingest and Engine then Go Live

Version 1.0.0

Add an ingest and a transcoding engine to a channel, start it, and poll until playing.

1 workflow 1 source API 1 provider
View Spec View on GitHub MediaStreamingReal-time StreamingWebRTCLive StreamingLow LatencyVideoAudioBroadcastPlayerAdvertisingDolby OptiViewMillicastTHEOliveTHEOplayerArazzoWorkflows

Provider

dolby-io

Workflows

attach-ingest-engine-and-go-live
Create an ingest and engine on a channel, start it, and wait for playing.
Attaches a source ingest and a transcoding engine to an existing channel, starts the channel, and waits until the channel status settles on playing or error.
4 steps inputs: abrLadderId, authorization, channelId, engineName, ingestName, ingestType, ingestUrl, region outputs: engineId, finalStatus, ingestId
1
createIngest
create-channel-ingest
Create the ingest (source feed) on the channel. Returns the ingest id and stream key under data.
2
createEngine
create-channel-engine
Provision a transcoding engine bound to the new ingest, deployed in the requested region with the chosen ABR ladder.
3
startChannel
start-channel
Start the channel, which boots the newly attached engine.
4
pollChannelStatus
get-channel
Poll the channel until its status reaches playing (live) or error. Status transitions through deploying, starting, waiting and ingesting while the engine spins up.

Source API Descriptions

Arazzo Workflow Specification

dolby-io-attach-ingest-engine-and-go-live-workflow.yml Raw ↑
arazzo: 1.0.1
info:
  title: Dolby OptiView Attach Ingest and Engine then Go Live
  summary: Add an ingest and a transcoding engine to a channel, start it, and poll until playing.
  description: >-
    Builds out a THEOlive channel's transcode pipeline end to end. The workflow
    creates an ingest (the source feed), provisions a transcoding engine bound
    to that ingest with a chosen ABR ladder, starts the channel, then poll-loops
    the channel until its documented status reaches playing or error. Engine
    deployment and start-up are asynchronous, so the poll loop mirrors the async
    media-job pattern. Every step inlines its Authorization header and request
    body so the flow can be read and executed without opening the underlying
    OpenAPI description.
  version: 1.0.0
sourceDescriptions:
- name: theoliveApi
  url: ../openapi/dolby-io-theolive-api-openapi.yml
  type: openapi
workflows:
- workflowId: attach-ingest-engine-and-go-live
  summary: Create an ingest and engine on a channel, start it, and wait for playing.
  description: >-
    Attaches a source ingest and a transcoding engine to an existing channel,
    starts the channel, and waits until the channel status settles on playing
    or error.
  inputs:
    type: object
    required:
    - authorization
    - channelId
    - ingestName
    - ingestType
    - engineName
    - region
    - abrLadderId
    properties:
      authorization:
        type: string
        description: HTTP Basic Authorization header value.
      channelId:
        type: string
        description: The id of the channel to attach the ingest and engine to.
      ingestName:
        type: string
        description: Name of the ingest to create.
      ingestType:
        type: string
        description: Ingest type (rtmp-push, rtmp-pull, srt-pull, srt-push, or sdi-pull).
      ingestUrl:
        type: string
        description: Source URL (required for pull ingest types).
      region:
        type: string
        description: Region id to deploy the engine in (and required for rtmp-push ingests).
      engineName:
        type: string
        description: Name of the transcoding engine to create.
      abrLadderId:
        type: string
        description: ABR ladder id used for the engine quality configuration.
  steps:
  - stepId: createIngest
    description: >-
      Create the ingest (source feed) on the channel. Returns the ingest id and
      stream key under data.
    operationId: create-channel-ingest
    parameters:
    - name: id
      in: path
      value: $inputs.channelId
    - name: Authorization
      in: header
      value: $inputs.authorization
    requestBody:
      contentType: application/json
      payload:
        name: $inputs.ingestName
        type: $inputs.ingestType
        url: $inputs.ingestUrl
        region: $inputs.region
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      ingestId: $response.body#/data/id
      streamKey: $response.body#/data/streamKey
  - stepId: createEngine
    description: >-
      Provision a transcoding engine bound to the new ingest, deployed in the
      requested region with the chosen ABR ladder.
    operationId: create-channel-engine
    parameters:
    - name: id
      in: path
      value: $inputs.channelId
    - name: Authorization
      in: header
      value: $inputs.authorization
    requestBody:
      contentType: application/json
      payload:
        ingestId: $steps.createIngest.outputs.ingestId
        name: $inputs.engineName
        region: $inputs.region
        quality:
          abrLadderId: $inputs.abrLadderId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      engineId: $response.body#/data/id
      engineStatus: $response.body#/data/status
  - stepId: startChannel
    description: Start the channel, which boots the newly attached engine.
    operationId: start-channel
    parameters:
    - name: id
      in: path
      value: $inputs.channelId
    - name: Authorization
      in: header
      value: $inputs.authorization
    successCriteria:
    - condition: $statusCode == 204
  - stepId: pollChannelStatus
    description: >-
      Poll the channel until its status reaches playing (live) or error. Status
      transitions through deploying, starting, waiting and ingesting while the
      engine spins up.
    operationId: get-channel
    parameters:
    - name: id
      in: path
      value: $inputs.channelId
    - name: Authorization
      in: header
      value: $inputs.authorization
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      status: $response.body#/data/status
    onSuccess:
    - name: live
      type: end
      criteria:
      - context: $response.body
        condition: $.data.status == "playing"
        type: jsonpath
    - name: failed
      type: end
      criteria:
      - context: $response.body
        condition: $.data.status == "error"
        type: jsonpath
    - name: keepPolling
      type: goto
      stepId: pollChannelStatus
      criteria:
      - context: $response.body
        condition: $.data.status != "playing" && $.data.status != "error"
        type: jsonpath
  outputs:
    ingestId: $steps.createIngest.outputs.ingestId
    engineId: $steps.createEngine.outputs.engineId
    finalStatus: $steps.pollChannelStatus.outputs.status