Summary

RED Command Protocol 2 (RCP2) is a text-based, asynchronous protocol for controlling RED EPIC, SCARLET, and DSMC2 cinema cameras over RS-232 serial, TCP/IP (Gigabit Ethernet), WiFi, and UDP. It provides comprehensive camera control including recording, playback, exposure, image parameters, lens control, audio, overlays, and system management. Messages are human-readable with optional XOR checksums.

Transport

protocols:
  - tcp
  - serial
  - udp
addressing:
  port: 1111
serial:
  baud_rate: 115200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
udp:
  discovery_port: 1112
auth:
  type: none  # inferred: no auth procedure in source

Traits

traits:
  - powerable    # SHUTDOWN command present; camera cannot be powered on remotely
  - queryable    # GET (G) command returns current parameter values
  - levelable    # gain, volume, brightness, ISO, color temp etc. are continuous ranges

Actions

actions:
  - id: set_parameter
    label: Set Parameter
    kind: action
    description: "Set a camera parameter value. Command char 'S'. Syntax: #$EXT:S:<ParamID>:<Value>:"
    params:
      - name: param_id
        type: string
        description: "Parameter identifier (up to 8 alphanumeric chars, e.g. ISO, COLTMP, RECORD)"
      - name: value
        type: string
        description: "Value as string representation"

  - id: get_parameter
    label: Get Parameter
    kind: action
    description: "Get current parameter value. Command char 'G'. Syntax: #$EXT:G:<ParamID>:"
    params:
      - name: param_id
        type: string
        description: "Parameter identifier"

  - id: get_parameter_list
    label: Get Parameter List
    kind: action
    description: "Get list of valid values for a parameter. Command char 'H'. Syntax: #$EXT:H:<ParamID>:"
    params:
      - name: param_id
        type: string

  - id: set_relative
    label: Set Relative
    kind: action
    description: "Adjust parameter relative to current value. Command char 'U'. Syntax: #$EXT:U:<ParamID>:<delta>:"
    params:
      - name: param_id
        type: string
      - name: delta
        type: integer
        description: "Positive or negative offset from current value"

  - id: set_list_relative
    label: Set List Relative
    kind: action
    description: "Move selection within list by offset. Command char 'V'. Syntax: #$EXT:V:<ParamID>:<offset>:"
    params:
      - name: param_id
        type: string
      - name: offset
        type: integer
        description: "Number of list entries to move (positive or negative)"

  - id: get_periodic
    label: Get Periodic
    kind: action
    description: "Start (1) or stop (0) periodic output of a parameter. Command char 'I'. Syntax: #$EXT:I:<ParamID>:<0|1>:"
    params:
      - name: param_id
        type: string
      - name: enable
        type: integer
        description: "1 to start periodic output, 0 to stop"

  - id: record_start
    label: Start Recording
    kind: action
    description: "Start recording. Syntax: #$EXT:S:RECORD:1:"
    params: []

  - id: record_stop
    label: Stop Recording
    kind: action
    description: "Stop recording. Syntax: #$EXT:S:RECORD:0:"
    params: []

  - id: record_toggle
    label: Toggle Recording
    kind: action
    description: "Toggle record state. Syntax: #$EXT:S:RECORD:2:"
    params: []

  - id: shutdown
    label: Shutdown Camera
    kind: action
    description: "Shutdown camera. Cannot be powered on remotely. Syntax: #$EXT:S:SHUTDOWN::"
    params: []

  - id: playback_enter
    label: Enter Playback Mode
    kind: action
    description: "Switch camera to playback mode. Syntax: #$EXT:S:PLAYBACK:1:"
    params: []

  - id: playback_exit
    label: Exit Playback Mode
    kind: action
    description: "Return to preview mode. Syntax: #$EXT:S:PLAYBACK:0:"
    params: []

  - id: play_clip
    label: Play Clip
    kind: action
    description: "Play current clip. Value ignored, send 0. Syntax: #$EXT:S:PLAY:0:"
    params: []

  - id: pause_clip
    label: Pause Clip
    kind: action
    description: "Pause current clip. Value ignored, send 0. Syntax: #$EXT:S:PAUSE:0:"
    params: []

  - id: send_keycode
    label: Send Key Code
    kind: action
    description: "Send a generic key code. Syntax: #$EXT:S:KEYCODE:<code>:"
    params:
      - name: keycode
        type: integer
        description: "32-bit key code value (see key code tables in source)"

  - id: send_key_action
    label: Send Key Action
    kind: action
    description: "Send a key action, optionally with argument. Syntax: #$EXT:S:KEYACT:<action_code>[,<argument>]:"
    params:
      - name: action_code
        type: integer
        description: "Action code from key_action_t enum"
      - name: argument
        type: string
        required: false
        description: "Optional comma-separated argument (e.g. preset name)"

  - id: set_iso
    label: Set ISO
    kind: action
    description: "Set ISO value. Syntax: #$EXT:S:ISO:<value>:"
    params:
      - name: value
        type: integer
        description: "ISO value (250, 320, 400, 500, 640, 800, 1000, 1280, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800)"

  - id: set_color_temperature
    label: Set Color Temperature
    kind: action
    description: "Set color temp in Kelvin * 1000. Syntax: #$EXT:S:COLTMP:<value>:"
    params:
      - name: value
        type: integer
        description: "Color temperature * 1000, range 1700000 to 100000000 (1700-100000K)"

  - id: set_exposure_time
    label: Set Exposure Time Target
    kind: action
    description: "Set exposure time target. Syntax: #$EXT:S:SHTIMET:<value>:"
    params:
      - name: value
        type: integer
        description: "Exposure time denominator * 1000 (e.g. 48000 = 1/48 sec)"

  - id: set_shutter_angle
    label: Set Shutter Angle Target
    kind: action
    description: "Set shutter angle target. Syntax: #$EXT:S:SHANGLET:<value>:"
    params:
      - name: value
        type: integer
        description: "Shutter angle in degrees * 1000, range 1 to 360000"

  - id: set_aperture
    label: Set Aperture Target
    kind: action
    description: "Set aperture target. Syntax: #$EXT:S:APRTRT:<value>:"
    params:
      - name: value
        type: integer
        description: "Aperture F# * 10"

  - id: set_project_fps
    label: Set Project Frame Rate
    kind: action
    description: "Set project frame rate. Syntax: #$EXT:S:PROJFPS:<value>:"
    params:
      - name: value
        type: integer
        description: "Frame rate * 1001 (e.g. 24000, 24024, 25025, 30000, 48000, 50050, 60000)"

  - id: set_format
    label: Set Image Format
    kind: action
    description: "Set resolution/aspect/anamorphic combined. Syntax: #$EXT:S:FORMAT2:<value>:"
    params:
      - name: value
        type: integer
        description: "Combined 32-bit value: (look_around << 16) + (anamorphic << 12) + (aspect << 4) + resolution"

  - id: set_redcode_target
    label: Set REDcode Target
    kind: action
    description: "Set REDcode compression target. Syntax: #$EXT:S:RCTARGET:<value>:"
    params:
      - name: value
        type: integer
        description: "REDCODE target * 100, range 300 to 1800"

  - id: format_media
    label: Format Media
    kind: action
    description: "Format the specified media. Syntax: #$EXT:S:FMTMEDIA:<media_loc>:"
    params:
      - name: media_loc
        type: integer
        description: "Media location (see media_loc_t)"

  - id: eject_media
    label: Eject Media
    kind: action
    description: "Eject media. Syntax: #$EXT:S:EJECT:<media_loc>:"
    params:
      - name: media_loc
        type: integer

  - id: discover_cameras
    label: Discover Cameras
    kind: action
    description: "Broadcast UDP to port 1112 to discover cameras on network. Send #$EXT:G:CAMINFO: as datagram payload."
    params: []

  - id: apply_preset
    label: Apply Camera Preset
    kind: action
    description: "Apply a named preset. Syntax: #$EXT:S:CPREAPLY:<preset_name>:"
    params:
      - name: preset_name
        type: string

  - id: apply_look
    label: Apply Camera Look
    kind: action
    description: "Apply a named look. Syntax: #$EXT:S:CLOKAPLY:<look_name>:"
    params:
      - name: look_name
        type: string

  - id: reset_factory_defaults
    label: Reset Factory Defaults
    kind: action
    description: "Initiate factory reset. Syntax: #$EXT:S:RESETDEF::"
    params: []

  - id: calibrate_auto
    label: Auto Calibration
    kind: action
    description: "Start auto user calibration. Syntax: #$EXT:S:CALAUTO::"
    params: []

Feedbacks

feedbacks:
  - id: current_parameter
    type: string
    description: "Unsolicited CURRENT (C) command sent when any parameter changes. Syntax: #<camera>:C:<ParamID>:<Value>:"

  - id: record_state
    type: enum
    values: [not_recording, recording, intermediate_states]
    description: "Current recording state via C:RECORD:. 0=not recording, 1=recording, other intermediate states possible"

  - id: playback_state
    type: enum
    values: [in_playback, not_in_playback]
    description: "Current playback state via C:PLAYBACK:. 0=not in playback, 1=in playback"

  - id: camera_info
    type: string
    description: "Camera serial, type, firmware, IP, interface via C:CAMINFO:"

  - id: firmware_version
    type: string
    description: "Camera firmware version via C:CAMFWVER: (n.n.n format)"

  - id: rcp_version
    type: integer
    description: "RCP protocol version via C:RCPVER:"

  - id: parameter_set_version
    type: integer
    description: "RCP parameter set version via C:RCPPSVER:. 32-bit: major << 16 + minor"

  - id: asic_temperature
    type: integer
    description: "Current ASIC temperature in degrees C via C:CURRTEMP:"

  - id: sensor_temperature
    type: integer
    description: "Current sensor temperature in degrees C via C:CURSENST:"

  - id: media_free_percent
    type: integer
    description: "Media free space percentage 0-100, -1 = no media. Via C:MEDIAPCT:"

  - id: power_level
    type: integer
    description: "Battery/power level via C:PWRBATL:. 0-100=percent, >100=voltage*1000, <0=seconds remaining * -1"

  - id: timecode
    type: integer
    description: "Posted timecode via C:POSTTC:. 32-bit packed hh:mm:ss:ff, sent automatically each second"

  - id: notification
    type: string
    description: "System notification dialog via C:NOTIFY:. Includes UUID, title, message, progress, response options"

  - id: fan_speed_top
    type: integer
    description: "Top fan speed percentage 0-100 via C:FANPCTT:"

  - id: fan_speed_front
    type: integer
    description: "Front fan speed percentage 0-100 via C:FANPCTF:"

  - id: clip_info
    type: string
    description: "Extended clip info via C:MEDAGCII:. Returns name, date, time, FPS, timecodes for indexed clip"

  - id: audio_vu
    type: string
    description: "VU meter peak readings (10 values) via C:AUDIOVU:. dB = (raw - 20) clipped to -52..0"

  - id: histogram
    type: string
    description: "Downsampled histogram data via C:DSHIST:. Packed RGBL data with base64 encoding"

  - id: clip_name
    type: string
    description: "Next recording clip name via C:CLIPNAME:"

Variables

variables:
  - id: iso
    label: ISO
    type: integer
    description: "ISO sensitivity. SET via S:ISO:<value>:, GET via G:ISO:"
    values: [250, 320, 400, 500, 640, 800, 1000, 1280, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800]

  - id: color_temperature
    label: Color Temperature
    type: integer
    description: "Color temp in Kelvin * 1000, range 1700000-100000000. SET via S:COLTMP:, relative via U:COLTMP:"

  - id: tint
    label: Tint
    type: integer
    description: "Tint * 1000, range -100000 to +100000. SET via S:TINT:, relative via U:TINT:"

  - id: red_gain
    label: Red Gain
    type: integer
    description: "Red linear gain * 1000, range 0-10000. SET via S:REDG:, relative via U:REDG:"

  - id: green_gain
    label: Green Gain
    type: integer
    description: "Green linear gain * 1000, range 0-10000. SET via S:GREENG:, relative via U:GREENG:"

  - id: blue_gain
    label: Blue Gain
    type: integer
    description: "Blue linear gain * 1000, range 0-10000. SET via S:BLUEG:, relative via U:BLUEG:"

  - id: saturation
    label: Saturation
    type: integer
    description: "Saturation * 1000, range 0-4000. SET via S:SATURAT:, relative via U:SATURAT:"

  - id: flut
    label: FLUT
    type: integer
    description: "FLUT * 1000, range -8000 to +8000. SET via S:FLUT:, relative via U:FLUT:"

  - id: brightness
    label: Brightness
    type: integer
    description: "Brightness * 1000, range -10000 to +10000. SET via S:BRIGHT:"

  - id: contrast
    label: Contrast
    type: integer
    description: "Contrast * 1000, range -1000 to +1000. SET via S:CONTRST:"

  - id: shutter_angle
    label: Shutter Angle
    type: integer
    description: "Shutter angle in degrees * 1000, range 1-360000. Read via C:SHANGLE:, set target via S:SHANGLET:"

  - id: exposure_time
    label: Exposure Time
    type: integer
    description: "Exposure time denominator * 1000. Read via C:SHTIME:, set target via S:SHTIMET:"

  - id: aperture
    label: Aperture
    type: integer
    description: "Aperture F# * 10. Read via C:APRTR:, set target via S:APRTRT:"

  - id: sensor_fps
    label: Sensor Frame Rate
    type: integer
    description: "Sensor FPS * 1001. SET via S:SENSFPS:"

  - id: project_fps
    label: Project Frame Rate
    type: integer
    description: "Project FPS * 1001. SET via S:PROJFPS:"

  - id: redcode
    label: REDcode
    type: integer
    description: "REDCODE quality * 100, range 300-1800. Read via C:REDCODE:, set target via S:RCTARGET:"

  - id: audio_gain_ch1
    label: Audio Gain Channel 1
    type: integer
    description: "Channel 1 gain, range 8-38 (+30 to +60 dB, 1 dB/step). SET via S:CH1GAIN:"

  - id: audio_volume_ch1
    label: Audio Volume Channel 1
    type: integer
    description: "Channel 1 volume, range 71-127 (-28 to 0 dB, 0.5 dB/step). SET via S:CH1VOL:"

  - id: lcd_brightness
    label: LCD Brightness
    type: integer
    description: "BRAIN LCD brightness, range 1-8. SET via S:BLCDBR:"

  - id: evf_brightness
    label: EVF Brightness
    type: integer
    description: "BRAIN EVF brightness, range 1-8. SET via S:BEVFBR:"

Events

events:
  - id: current_value_update
    description: "Unsolicited CURRENT (C) command sent to all agents when any parameter value changes"

  - id: timecode_post
    description: "POSTTC sent automatically every second when TOD timecode is selected"

  - id: notification_dialog
    description: "NOTIFY sent when system notification needs display; requires NOTIFYR response for dismissable dialogs"

  - id: frame_tagged
    description: "TAGGED sent when a frame is tagged during recording"

  - id: dropped_frames
    description: "C:DRPFRMS: sent with count of dropped frames during record since boot"

  - id: periodic_data
    description: "Parameters enabled via GET_PERIODIC (I) are sent at regular intervals (e.g. AUDIOVU at 10 Hz, MPITCH/MROLL at 3.33 Hz, DSHIST at 10 Hz)"

Macros

macros:
  - id: start_recording
    label: Start Recording
    steps:
      - action: set_parameter
        params: { param_id: "RECORD", value: "1" }
      - wait_for: "C:RECORD:1:"  # Confirm RECORD_STATE_RECORDING received
    description: "Send RECORD START and wait for CURRENT confirmation before next action"

  - id: stop_recording
    label: Stop Recording
    steps:
      - action: set_parameter
        params: { param_id: "RECORD", value: "0" }
      - wait_for: "C:RECORD:0:"  # Confirm RECORD_STATE_NOT_RECORDING
    description: "Send RECORD STOP and wait for CURRENT confirmation"

  - id: enter_playback_and_play
    label: Enter Playback and Play Last Clip
    steps:
      - action: set_parameter
        params: { param_id: "PLAYBACK", value: "1" }
      - wait_for: "C:PLAYBACK:1:"
      - action: set_parameter
        params: { param_id: "PLAY", value: "0" }
    description: "Switch to playback mode, confirm, then play last recorded clip"

  - id: discover_and_connect
    label: Discover and Connect to Camera
    steps:
      - action: discover_cameras
        description: "Broadcast #$EXT:G:CAMINFO: via UDP to port 1112, repeat 5x with 500ms delay"
      - description: "Collect CAMINFO responses, extract source IP from UDP header"
      - description: "Connect via TCP to discovered camera IP on port 1111"
    description: "Dynamic camera discovery on network when IP is unknown"

Safety

confirmation_required_for:
  - shutdown
  - format_media
  - secure_format_media
  - reset_factory_defaults
  - reset_user
interlocks:
  - description: "Camera cannot be powered on remotely via RCP"
  - description: "Camera must be in preview mode to record (not playback mode)"
  - description: "Max 8 simultaneous TCP connections; application should maintain only one and close before reopening"
  - description: "Record state changes are asynchronous - must wait for CURRENT confirmation before sending next record command"
# UNRESOLVED: no specific safety interlock sequences documented beyond operational notes above

Notes

  • RCP is text-based and human-readable. Messages use format # @TargetID $SourceID : Command : ParamID : Value : * Checksum <LF>.
  • Source ID for external controllers should be EXT. Camera responds with its configured name (e.g. EPIC, DRAGON).
  • Colons in values must be escaped with backslash (e.g. 11\:05\:39).
  • Checksum is optional. When used, compute XOR of all characters between # and *, send as hex ASCII after *.
  • Invalid SET/GET commands are silently ignored — no error response.
  • Parameters use scaling conventions: many values are multiplied by 1000, 100, or 10 to represent decimals as integers.
  • Use target parameters (SHANGLET, SHTIMET, RCTARGET, APRTRT) for SET operations; read actual values from corresponding non-target parameters (SHANGLE, SHTIME, REDCODE, APRTR).
  • Parameter sets are versioned (major.minor packed as 32-bit). Check RCPPSVER for compatibility.
  • Not all parameters support all commands. See per-group parameter tables for S/G/C support indicators.
  • WiFi and serial transport use identical protocol; only the physical layer differs.
  • UDP discovery broadcasts #$EXT:G:CAMINFO: to port 1112; cameras respond with CAMINFO including serial, name, firmware, interface type.

Provenance

source_domains:
  - red.com
source_urls:
  - "https://www.red.com/SSP%20Applications/Red@SuiteCentric/SCA%20Kilimanjaro/documents/910-0046_Rev-T___RED_ENG__RED_Command_Protocol_Reference_Guide.pdf"
  - https://www.red.com/download/rcp2-documentation
  - https://www.red.com/developers
retrieved_at: 2026-05-07T08:19:18.203Z
last_checked_at: 2026-06-02T22:13:30.656Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T22:13:30.656Z
matched_actions: 31
action_count: 31
confidence: medium
summary: "All 31 spec actions traced to source (dip-safe re-verify). (8 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "RCP parameter set versions vary by firmware; specific firmware version to parameter set mapping is not fully enumerated"
- "no specific safety interlock sequences documented beyond operational notes above"
- "full key code enumeration is extensive (~100+ codes) — see source tables for complete list"
- "many IMAGE group parameters (curves, CDL, LGG) have complex sub-parameter structures not fully decomposed here"
- "monitor/output group has per-port variants (BRAIN LCD, Rear LCD, EVF, HDMI, HD-SDI) with parallel parameters — representative entries shown"
- "audio group has per-channel variants (CH1-CH4) for gain, volume, mute, limiter, phantom power — representative entries shown"
- "WiFi configuration parameters (WLANMODE, WLANAHID, WLANAHPW, etc.) documented but not fully enumerated as actions"
- "power input/output port parameters use indexed addressing (MSG_INDEXED_INT) — requires PWILIST/PWOLIST query first"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0