12 July 2017
Quality Control
Quality Control(qc) is a feature that allows you to check your media quality while it processing.
Also you could check external media by adding 'qc_check_only' output format.
Note:
For now QC feature available for advanced_hls format only!
Test Name | API Param Name |
---|---|
Output Validation Tests | |
Check B-Frames Present | <qc_b_frames_present> |
Check B-Frames DTS grow | <qc_bframe_dts_grow> |
IDR interval is maintained | <qc_idr_interval> |
Closed Captions(608/708) are present and maintained | <qc_captions_presented> |
PCR interval is maintained | <qc_pcr_interval> |
PID interval is maintained | <qc_pid_interval> |
Each segment starts with IDR | <qc_segments_start_with_idr> |
No short segments | <qc_short_segment> |
Validate DTS | <qc_validate_dts> |
Validate PTS | <qc_validate_pts> |
Manifest Validation Tests | |
Master manifest has proper bitrate | <qc_bitrate_declaration> |
Master manifest has proper codec | <qc_codec_declaration> |
Discontinuity tags are proper placement | <qc_discontinuity_tags> |
Proper DRM URI | <qc_drm_uri> |
HLS version number | <qc_hls_version_number> |
CUE-OUT:0 proper placement | <qc_match_breakpoints> |
Check Sample AES Proper encryption | <qc_proper_sample_aes_encryption_declared> |
Target segment duration | <qc_target_segment_duration> |
Declared segment duration is correct | <qc_validate_segment_duration> |
Code Example:
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>AddMedia</action>
   <qc_notify>[QCNotifyURL]</qc_notify>
   <source>[SourceFile|SourcePlaylist]</source><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <!-- Format Validation Tests -->
           <qc_test_name_1>
               <!-- Tests Params -->
               <severity>[fatal|warning]</severity>
           </qc_test_name_1>
           <qc_test_name_2>
               <!-- Tests Params -->
           </qc_test_name_2>
           <!-- Multiple Tests -->
           <qc_test_name_N>
               <!-- Tests Params -->
           </qc_test_name_N>
       </qc>
       <stream>
           <qc>
               <!-- Stream Validation Tests -->
               <qc_test_name_1>
                   <!-- Tests Params -->
                   <severity>[fatal|warning]</severity>
               </qc_test_name_1>
               <qc_test_name_2>
                   <!-- Tests Params -->
               </qc_test_name_2>
               <!-- Multiple Tests -->
               <qc_test_name_N>
                   <!-- Tests Params -->
               </qc_test_name_N>
           </qc>
       </stream>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "AddMedia",
"qc_notify": "[QCNotifyURL]",
"source": "[SourceFile|SourcePlaylist]",
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_test_name_1": {
"severity": "[fatal|warning]"
},
"qc_test_name_2": {},
"qc_test_name_n": {}
},
"stream": {
"qc": {
"qc_test_name_1": {
"severity": "[fatal|warning]"
},
"qc_test_name_2": {},
"qc_test_name_n": {}
}
}
}
}
}
Common tests params:
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | Test severity Level | warning – Tests with 'warning' severity generate messages in report but qc process will continue. fatal – Tests with 'fatal' severity will stop QC process. | warning |
<?xml version="1.0"?>
<query>
   <!-- Main fields -->
   <userid><<id>></userid>
   <userkey><<key>></userkey>
   <action>[Action]</action>
   <source>[SourceFile]</source>
   <notify_format>[xml|json]</notify_format>
   <qc_notify>[QCNotifyURL]</qc_notify>
   <format>
       <!-- Format fields -->
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "[Action]",
"source": "[SourceFile]",
"notify_format": "[xml|json]",
"qc_notify": "[QCNotifyURL]",
"format": {}
}
}
QC_Notify
Can be either an HTTP(S) URL for the script or a mailto: link with email address for which notification will be sent when QC processing finished for each output format.
Callback Format
<?xml version="1.0"?>
<report>
    <mediaID>[MediaID]</mediaID>
    <queueID>[QueueID]</queueID>
    <status>[QCStatus]</status>
    <passed>
        <test>
            <name>[QCTestName]</name>
            <filesProcessed>[FilesCount]</filesProcessed>
        </test>
        <test>
            <!-- Test params -->
        </test>
    </passed>
    <warnings>
        <!-- Failed Tests with severity set to 'warning' -->
        <warning>
            <streamID>[StreamID]</streamID>
            <testName>[QCTestName]</testName>
            <fileName>[FileName]</fileName>
            <message>[Message]</message>
        </warning>
        <warning>
            <!-- Test warning params -->
        </warning>
    </warnings>
    <errors>
        <!-- Failed Tests with severity set to 'failed' -->
        <error>
            <streamID>[StreamID]</streamID>
            <testName>[QCTestName]</testName>
            <fileName>[FileName]</fileName>
            <message>[Message]</message>
        </error>
        <error>
            <!-- Test failed params -->
        </error>
    </errors>
</report>
{
"report": {
"mediaid": "[MediaID]",
"queueid": "[QueueID]",
"status": "[QCStatus]",
"passed": {
"test": [
{
"name": "[QCTestName]",
"filesprocessed": "[FilesCount]"
}
]
},
"warnings": {
"warning": [
{
"streamid": "[StreamID]",
"testname": "[QCTestName]",
"filename": "[FileName]",
"message": "[Message]"
}
]
},
"errors": {
"error": [
{
"streamid": "[StreamID]",
"testname": "[QCTestName]",
"filename": "[FileName]",
"message": "[Message]"
}
]
}
}
}
Request:
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <queueid>[QueueID]</queueid><!-- OPTIONAL -->
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": "[MediaID]",
"queueid": "[QueueID]"
}
}
Field Name | Description | Allowed Values | Default Values |
---|---|---|---|
mediaid | Media ID | Positive Number | |
queueid | Format ID | Positive Number |
Response:
Possible QC Statuses:
Name | Description |
---|---|
Transcoding | QC not started since transcoding job is not finished |
Validating | QC is in progress |
Passed | QC sucessfully finished. All tests passed. |
Quarantined | Some QC Tests failed and output was sent to quarantine destination |
Failed | Critical QC Tests failed |
Stopped | QC process was suddenly stopped due to error |
<?xml version="1.0"?>
<response>
   <format>
       <QueueID>[QueueID]</QueueID>
       <report>
           <mediaID>[MediaID]</mediaID>
           <queueID>[QueueID]</queueID>
           <status>[QCStatus]</status>
           <passed>
               <test>
                   <name>[QCTestName]</name>
                   <filesProcessed>[FilesCount]</filesProcessed>
               </test>
               <test>
                   <!-- Test params -->
               </test>
           </passed>
           <warnings>
               <!-- Failed Tests with severity set to 'warning' -->
               <warning>
                   <streamID>[StreamID]</streamID>
                   <testName>[QCTestName]</testName>
                   <fileName>[FileName]</fileName>
                   <message>[Message]</message>
               </warning>
               <warning>
                   <!-- Test warning params -->
               </warning>
           </warnings>
           <errors>
               <!-- Failed Tests with severity set to 'failed' -->
               <error>
                   <streamID>[StreamID]</streamID>
                   <testName>[QCTestName]</testName>
                   <fileName>[FileName]</fileName>
                   <message>[Message]</message>
               </error>
               <error>
                   <!-- Test failed params -->
               </error>
           </errors>
       </report>
   </format>
   <format>
       <!-- Format QC Tests report -->
   </format>
</response>
{
"response": {
"format": [
{
"queueid": "[QueueID]",
"report": {
"mediaid": "[MediaID]",
"queueid": "[QueueID]",
"status": "[QCStatus]",
"passed": {
"test": [
{
"name": "[QCTestName]",
"filesprocessed": "[FilesCount]"
}
]
},
"warnings": {
"warning": [
{
"streamid": "[StreamID]",
"testname": "[QCTestName]",
"filename": "[FileName]",
"message": "[Message]"
}
]
},
"errors": {
"error": [
{
"streamid": "[StreamID]",
"testname": "[QCTestName]",
"filename": "[FileName]",
"message": "[Message]"
}
]
}
}
}
]
}
}
Checks that b-frames present in main profile encodes and not present in baseline profiles
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_b_frames_present>
               <value>[yes|no]</value>
               <severity>[fatal|warning]</severity>
           </qc_b_frames_present>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_b_frames_present": {
"value": "[yes|no]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | Check if b-frames present or not | yes, no | |
severity | warning, fatal | warning |
Checks growing of the B frames pkt_dts value.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_bframe_dts_grow>
               <severity>[fatal|warning]</severity>
           </qc_bframe_dts_grow>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_bframe_dts_grow": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | warning |
Checks that IDR interval is maintained with presented deviation
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_idr_interval>
               <deviation>[Number]</deviation>
               <severity>[fatal|warning]</severity>
           </qc_idr_interval>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_idr_interval": {
"deviation": "[Number]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
deviation | IDR interval deviation | Number | |
severity | warning, fatal | warning |
Checks that Closed Captions(608/708) are present and maintained
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_captions_presented>
               <type>[CaptionType]</type>
               <!-- Multiple Caption Types -->
               <severity>[fatal|warning]</severity>
           </qc_captions_presented>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_captions_presented": {
"type": "[CaptionType]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
type | Closed Captions Type | 608, 708 | |
severity | warning, fatal | warning |
Checks PCR interval
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_pcr_interval>
               <value>[Number]</value>
               <severity>[fatal|warning]</severity>
           </qc_pcr_interval>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_pcr_interval": {
"value": "[Number]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | PCR interval value | Positive integer | 40 |
severity | warning, fatal | warning |
Check that PID interval is maintained
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_pid_interval>
               <value>[Number]</value>
               <severity>[fatal|warning]</severity>
           </qc_pid_interval>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_pid_interval": {
"value": "[Number]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | PID interval value | Positive integer | 700 |
severity | warning, fatal | warning |
Analyzes GOP structure. Checks that each segment starts with IDR.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_segments_start_with_idr>
               <severity>[fatal|warning]</severity>
           </qc_segments_start_with_idr>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_segments_start_with_idr": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | warning |
Checks that there no segments(.ts files) with duration shorter than N seconds.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_short_segment>
               <value>[Number]</value>
               <severity>[fatal|warning]</severity>
           </qc_short_segment>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_short_segment": {
"value": "[Number]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | minimum segment duration in seconds | Positive integer | 1 |
severity | warning, fatal | warning |
Check that DTS values grow up and DTS greater than PCR
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_validate_dts>
               <severity>[fatal|warning]</severity>
           </qc_validate_dts>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_validate_dts": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | fatal |
Checks if Presentation Time Stamp(PTS) repetition is less than 700ms
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_validate_pts>
               <severity>[fatal|warning]</severity>
           </qc_validate_pts>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_validate_pts": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | fatal |
Checks that proper bitrate information declared in master manifest
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_bitrate_declaration>
               <allowed_deviation>[Percent]</allowed_deviation>
               <severity>[fatal|warning]</severity>
           </qc_bitrate_declaration>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_bitrate_declaration": {
"allowed_deviation": "[Percent]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
allowed_deviation | Duration deviation in percent | 0 to 100 integer | 20 |
severity | warning, fatal | warning |
Checks that proper codec information declared in master manifest
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_codec_declaration>
               <severity>[fatal|warning]</severity>
           </qc_codec_declaration>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_codec_declaration": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | warning |
Checks that discontinuity tags are placed at program segment boundaries
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_discontinuity_tags>
               <value>[ProgramSegmentStart1-ProgramSegmentEnd1]</value>
               <value>[ProgramSegment2Start2-ProgramSegmentEnd2]</value>
               <!-- Multiple value tags -->
               <allowed_deviation>[Percent]</allowed_deviation>
               <severity>[fatal|warning]</severity>
           </qc_discontinuity_tags>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_discontinuity_tags": {
"value": [
"[ProgramSegmentStart1-ProgramSegmentEnd1]",
"[ProgramSegment2Start2-ProgramSegmentEnd2]"
],
"allowed_deviation": "[Percent]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | Program Segment Boudaries | 2 positive integers in fromat 'start-end' | |
allowed_deviation | Duration deviation in percent | 0 to 100 integer | 10 |
severity | warning, fatal | warning |
Checks that proper DRM URI set for each DRM system
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_drm_uri>
               <severity>[fatal|warning]</severity>
           </qc_drm_uri>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_drm_uri": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | warning |
Checks HLS version
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_hls_version_number>
               <value>[Number]</value>
               <severity>[fatal|warning]</severity>
           </qc_hls_version_number>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_hls_version_number": {
"value": "[Number]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | HLS Version | 1 to 7 integer | |
severity | warning, fatal | warning |
Checks that CUE-OUT:0 tag is placed at program segment boundaries – matches declared breakpoints in the input.json
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_match_breakpoints>
               <value>[ProgramSegmentStart1-ProgramSegmentEnd1]</value>
               <value>[ProgramSegment2Start2-ProgramSegmentEnd2]</value>
               <!-- Multiple value tags -->
               <allowed_deviation>[Percent]</allowed_deviation>
               <severity>[fatal|warning]</severity>
           </qc_match_breakpoints>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_match_breakpoints": {
"value": [
"[ProgramSegmentStart1-ProgramSegmentEnd1]",
"[ProgramSegment2Start2-ProgramSegmentEnd2]"
],
"allowed_deviation": "[Percent]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | Program Segment Boudaries | 2 positive integers in fromat 'start-end' | |
allowed_deviation | Duration deviation in percent | 0 to 100 integer | 10 |
severity | warning, fatal | warning |
Checks that sum of EXT_INF data from each profile for each program segment in the manifest exactly matches the durations declared in the output.json
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_match_durations>
               <allowed_deviation>[Percent]</allowed_deviation>
               <severity>[fatal|warning]</severity>
           </qc_match_durations>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_match_durations": {
"allowed_deviation": "[Percent]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
allowed_deviation | Duration deviation in percent | 0 to 100 integer | 10 |
severity | warning, fatal | warning |
Checks that proper Sample AES encryption is declared
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_proper_sample_aes_encryption_declared>
               <severity>[fatal|warning]</severity>
           </qc_proper_sample_aes_encryption_declared>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_proper_sample_aes_encryption_declared": {
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
severity | warning, fatal | warning |
Checks segment duration.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- required -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- required -->
       <!-- Format fields -->
       <qc>
           <qc_target_segment_duration>
               <value>[Number]</value>
               <minimum_duration>[Number]</minimum_duration>
               <allowed_deviation>[Percent]</allowed_deviation>
               <severity>[fatal|warning]</severity>
           </qc_target_segment_duration>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": "[MediaID]",
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_target_segment_duration": {
"value": "[Number]",
"minimum_duration": "[Number]",
"allowed_deviation": "[Percent]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
value | Segment Duartion in seconds | Positive integer | |
minimum_duration | Minimum segment duration in seconds. Shorter segments should be merged with previous segment. | Positive integer | 1 |
allowed_deviation | Duration deviation in percent | 0 to 100 integer | 10 |
severity | warning, fatal | warning |
Checks that segment duration declared in manifests is actual.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>GetQCStatus</action>
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <mediaid>[MediaID]</mediaid><!-- REQUIRED -->
   <format>
       <output>[advanced_hls|qc_check_only]</output><!-- REQUIRED -->
       <!-- Format fields -->
       <qc>
           <qc_validate_segment_duration>
               <allowed_deviation>[Percent]</allowed_deviation>
               <severity>[fatal|warning]</severity>
           </qc_validate_segment_duration>
       </qc>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "GetQCStatus",
"mediaid": [
"[MediaID]",
"[MediaID]"
],
"format": {
"output": "[advanced_hls|qc_check_only]",
"qc": {
"qc_validate_segment_duration": {
"allowed_deviation": "[Percent]",
"severity": "[fatal|warning]"
}
}
}
}
}
Field | Description | Allowed Values | Default Value |
---|---|---|---|
allowed_deviation | Duration deviation in percent | 0 to 100 integer | 10 |
severity | warning, fatal | warning |
fMP4 HLS
Added new advanced multibitrate output format fmp4_hls.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>[Action]</action> <!-- required-->
   <format>
       <output>fmp4_hls</output>
       <stream>
           <!-- [Video settings params](ref:VideoSettings) -->
           <profile>[high|main|baseline]</profile>
           <!-- [Audio settings params](ref:AudioSettings) -->
           <!-- [Other format params](ref:OtherFormatOptions) -->
           <!-- [Closed Captions params](ref:ClosedCaptions) -->
           <!-- [Editing features params](ref:EditingFeatures) -->
           <still_image>[no|each_segment|first_segment]</still_image>
           <still_image_time>[Time]</still_image_time>
           <still_image_size>[Size]</still_image_size>
           <byte_range>[yes|no]</byte_range>
           <add_iframe_stream>[yes|no]</add_iframe_stream>
           <audio_only>[yes|no]</audio_only>
           <video_only>[yes|no]</video_only>
           <group_id>[GroupID]</group_id>
           <use_group_id>[CommaSeparatedList]</use_group_id>
           <playlist_version>[Valid EXT-X-VERSION]</playlist_version>
           <sub_path>[Playlist sub path]</sub_path>
           <media_path>[Playlist sub path]</media_path>
           <!-- Manifests fields -->
           <manifest>
               <basename>[BaseName]</basename> <!-- required-->
               <add_to_manifest>[ManifestName]:[Position],[ManifestName]:[Position]</add_to_manifest>
               <destination>[ManifestDestination]</destination>
           </manifest>
           <!-- Multiple manifests may be included -->
           <manifest>
              <!-- manifest params -->
           </manifest>
       </stream>
       <!-- Multiple stream params may be included in output format -->
       <!-- Maximum number of available streams is 15 -->
       <stream>
          <!-- stream params -->
       </stream>
       <!-- Manifests fields -->
       <manifest>
           <basename>[BaseName]</basename> <!-- required-->
           <destination>[ManifestDestination]</destination>
           <add_audio_only>[yes|no]</add_audio_only>
       </manifest>
       <!-- Multiple manifests may be included -->
       <manifest>
          <!-- manifest params -->
       </manifest>
       <!-- Main/alternate source fields -->
       <main_source>
           <type>[video_audio|video|audio]</type>
           <video_name>[Name]</video_name>
           <audio_name>[Name]</audio_name>
           <use_stream_id>[CommaSeparatedList]</use_stream_id>
           <language>[Language]</language>
       </main_source>
       <!-- multiple alternate_sources may be included -->
       <alternate_source>
           <source>[FileURL]</source>
           <type>[video_audio|video|audio]</type>
           <video_name>[Name]</video_name>
           <audio_name>[Name]</audio_name>
           <use_stream_id>[CommaSeparatedList]</use_stream_id>
           <language>[Language]</language>
           <auto>[yes|no]</auto>
           <alternate_default>[yes|no|auto]</alternate_default>
           <alternate_autoselect>[yes|no]</alternate_autoselect>
       </alternate_source>
       <alternate_source>
          <!-- alternate_source params -->
       </alternate_source>
       <!-- multiple ad_breaks may be included -->
       <ad_break>
          <start>[StartTime]</start>
          <duration>[BreakDuration]</duration>
          <drop_segments>[yes|no]</drop_segments>
       </ad_break>
       <ad_break>
          <!-- ad_break params -->
       </ad_break>
       <!-- Format fields -->
       <duration_precision>[Number]</duration_precision>
       <segment_duration>[Duration]</segment_duration>
       <pack_files>[yes|no]</pack_files>
       <pack_type>[tar|zip]</pack_type>
       <pack_each_stream>[yes|no]</pack_each_stream>
       <encryption>[yes|no]</encryption>
       <encryption_method>[aes-128-cbc|sample-aes]</encryption_method>
       <encryption_key>[128bit-key]</encryption_key>
       <encryption_key_file>[SourceURL]</encryption_key_file>
       <encryption_iv>[Hexidecimal string]</encryption_iv>
       <segmenter>[v1|v2|v3|dolby_segmenter]</segmenter>
       <playlist_version>[Valid EXT-X-VERSION]</playlist_version>
       <merge_small_segments>[yes|no]</merge_small_segments>
       <destination>[DestFile]</destination> <!-- required-->
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "[Action]",
"format": {
"output": "fmp4_hls",
"stream": [
{
"profile": "[high|main|baseline]",
"still_image": "[no|each_segment|first_segment]",
"still_image_time": "[Time]",
"still_image_size": "[Size]",
"byte_range": "[yes|no]",
"add_iframe_stream": "[yes|no]",
"audio_only": "[yes|no]",
"video_only": "[yes|no]",
"group_id": "[GroupID]",
"use_group_id": "[CommaSeparatedList]",
"playlist_version": "[Valid EXT-X-VERSION]",
"sub_path": "[Playlist sub path]",
"media_path": "[Playlist sub path]",
"manifest": [
{
"basename": "[BaseName]",
"add_to_manifest": "[ManifestName]:[Position],[ManifestName]:[Position]",
"destination": "[ManifestDestination]"
}
]
}
],
"manifest": [
{
"basename": "[BaseName]",
"destination": "[ManifestDestination]",
"add_audio_only": "[yes|no]"
}
],
"main_source": {
"type": "[video_audio|video|audio]",
"video_name": "[Name]",
"audio_name": "[Name]",
"use_stream_id": "[CommaSeparatedList]",
"language": "[Language]"
},
"alternate_source": [
{
"source": "[FileURL]",
"type": "[video_audio|video|audio]",
"video_name": "[Name]",
"audio_name": "[Name]",
"use_stream_id": "[CommaSeparatedList]",
"language": "[Language]",
"auto": "[yes|no]",
"alternate_default": "[yes|no|auto]",
"alternate_autoselect": "[yes|no]"
}
],
"ad_break": [
{
"start": "[StartTime]",
"duration": "[BreakDuration]",
"drop_segments": "[yes|no]"
}
],
"duration_precision": "[Number]",
"segment_duration": "[Duration]",
"pack_files": "[yes|no]",
"pack_type": "[tar|zip]",
"pack_each_stream": "[yes|no]",
"encryption": "[yes|no]",
"encryption_method": "[aes-128-cbc|sample-aes]",
"encryption_key": "[128bit-key]",
"encryption_key_file": "[SourceURL]",
"encryption_iv": "[Hexidecimal string]",
"segmenter": "[v1|v2|v3|dolby_segmenter]",
"playlist_version": "[Valid EXT-X-VERSION]",
"merge_small_segments": "[yes|no]",
"destination": "[DestFile]"
}
}
}
Note
cea-608 mux type isn't available for fmp4_hls output format
Atlas DRM
Available for advanced multibitrate output formats: advanced_hls, fmp4_hls, advanced_dash, advanced_mss.
<?xml version="1.0"?>
<query>
   <userid><<id>></userid> <!-- required-->
   <userkey><<key>></userkey> <!-- required-->
   <action>[Action]</action> <!-- required-->
   <format>
       <output>[advanced_hls|fmp4_hls|advanced_dash|advanced_mss]</output>
       <atlas_drm>yes</atlas_drm>
       <atlas_company_id>[AtlasCompanyID]</atlas_company_id>
       <atlas_asset_id>[AtlasAssetID]</atlas_asset_id>
       <atlas_widevine_drm>[yes|no]</atlas_widevine_drm>Â
       <atlas_playready_drm>[yes|no]</atlas_playready_drm>Â
       <!-- <atlas_widevine_drm /> and <atlas_playready_drm /> services not available for advanced_hls and fmp4_hls output formats -->
       <atlas_env>[live|stage]</atlas_env>
   </format>
</query>
{
"query": {
"userid": "<<id>>",
"userkey": "<<key>>",
"action": "[Action]",
"format": {
"output": "[advanced_hls|fmp4_hls|advanced_dash|advanced_mss]",
"atlas_drm": "yes",
"atlas_company_id": "[AtlasCompanyID]",
"atlas_asset_id": "[AtlasAssetID]",
"atlas_widevine_drm": "[yes|no]",
"atlas_playready_drm": "[yes|no]",
"atlas_env": "[live|stage]"
}
}
}
Field Name | Description | Allowed Values | Default Values |
---|---|---|---|
atlas_drm | use Atlas DRM | yes, no | no |
atlas_company_id | Atlas DRM Company ID | Valid Company ID | no |
atlas_asset_id | Atlas DRM Asset ID | Valid Asset ID | |
atlas_widevine_drm | Use Atlas Widevine DRM | yes, no | |
atlas_playready_drm | Use Atlas Playready DRM | yes, no | |
Note | : Atlas Widevine and Atlas Playready DRM services not available for advanced_hls and fmp4_hls output formats | ||
atlas_env | Atlas DRM Environment | live, stage | live |