proposal for carriage of decoded DTMF Signalling information in NDI metadata

This page contains a technical proposal which is not currently a published or formal standard. If you have comments or feedback on the content of this proposal PLEASE contact us with your contribution.


This proposal defines a standardised wrapper to carry decoded DTMF messages over NDI by way of a recommended practice technical note.


Basic Premise:

This recommended practice provides a mechanism for a DTMF decoder to create an unambiguous representation of the DTMF messages in a stream and pass this onto another NDI system to action the message. It can also be used an another standardised mechanism to pass simple instructions from one NDI system to another. Finally it can be a message sent as an instruction to a DTMF generating system to instruct it to generate DTMF.


In this proposal, the DTMF Data  is sent using dedicated metadata messages already defined in the NDI Protocol.  It uses the real time (non frame based) NDI Metadata stream, with  DTMF message data enclosed as ASII text


Sent Messages are wrapped in the outer XML tag <DTMF>, a complete= attribute allows this tag to indicate that this message is sent following a defined break in DTMF tones, for example a gap period with no DTMF.


NDIlib_metadata_frame_t meta_data

meta_data.p_data =





<DTMF complete="1">0123*</DTMF>



In order to provide low latency responses, it is normal for a DTMF decoder to send a series of messages which each contain a growing string of characters, until there has been a final 'gap' period at which time the message string is 'finalised' with a complete=1 tag.


Typical Example

<DTMF complete="0">0</DTMF>

<DTMF complete="0">01</DTMF>

<DTMF complete="0">012</DTMF>

<DTMF complete="0">0123</DTMF>

<DTMF complete="0">0123*</DTMF>

<DTMF complete="1">0123*</DTMF>


In this typical example note that the final message content is  repeated twice, once when the final character * is received, and then again after a period of silence confirming no more characters in this message.



Typical Example 2

<DTMF complete="0" msgseq="1240">0</DTMF>

<DTMF complete="0" msgseq="1240">01</DTMF>

<DTMF complete="0" msgseq="1240">01*</DTMF>

<DTMF complete="1" msgseq="1240">01*</DTMF>



<DTMF complete="0" msgseq="1241">5</DTMF>

<DTMF complete="0" msgseq="1241">59</DTMF>

<DTMF complete="0" msgseq="1241">59*</DTMF>

<DTMF complete="1" msgseq="1241">59*</DTMF>


By including a msgseq id for subsequent messages sequences,  it may be easier for metadata parsers to ignore the repeated complete=1 message if they have already terminated the message by detecting a terminator like * or #




If you have any questions, or you would like to engage Sienna for NDI Consultancy or Custom Development, please contact info @ sienna.tv