Skip to content

FWM Hybrik Preprocessor Guide

DoveRunner FWM Hybrik preprocessor is a module that can perform forensic watermarking preprocessing during video transcoding through Dolby Hybrik service.

A/B version (0/1 version) mp4 video can be created through Hybrik encoder with preprocessor module applied, and each file can be packaged as DASH or HLS. If both forensic watermark and DRM are applied, please also refer to Hybrik DRM Integration Guide for DRM packaging through CPIX API.

sequenceDiagram
    participant A as Content service provider
(Customer) participant B as Customer's S3 storage participant C as Customer's EC2 instance
(with Hybrik engine) participant D as Dolby Hybrik
console or API participant E as DoveRunner service A ->> D: Register AWS credential (allow S3, EC2 access) A ->> B: Upload source video A ->> D: Register transcoding/packaging job D ->> C: Create instance with Hybrik B ->> C: Copy source video C -->> C: Encoding/transcoding Note right of C: A/B preprocessing
(FWM preprocessor) C -->> C: DASH/HLS packaging opt Apply multi-DRM C ->> E: Request encryption key (CPIX API) E ->> C: Response encryption key C -->> C: Encrypt content end C ->> B: Result of preprocessing and packaging Note right of B: DASH / HLS content
(A/B versions)

For a detailed information and guide to the Dolby Hybrik media processing service, please refer to the links below.

You can download an example JSON file for the full setup described in How to integrate section below. (Right-click and save as)

📥 Full example JSON file

Once signup is completed, please request for wm key file and access key through Help Desk.

2. How to set FWM preprocessor authentication information

Section titled “2. How to set FWM preprocessor authentication information”

Set the authentication information of the FWM preprocessor as follows:

{
"definitions": {
...
"wm_key_file_base64": "yxFNjptzCUNHE5d/gJ5g+fWZHi0XUFuZxHuFD0ycQCZvuVpQUMZO79OqVat5VMp9gZIRTrC63Lf3otykHBL9sVyEDr3jAqDnEBXD9JPiNne9bFf1k1hH1hUiIrj1YeYRtfNVdDstmC2JMBzApHdGjGPSRBE=",
"wm_access_key": "FOR_INKA_FORENSIC_WATERMARK_TEST",
...
},
...
}

3. How to setup transcoding and FWM preprocessor plugin

Section titled “3. How to setup transcoding and FWM preprocessor plugin”

To use the FWM preprocessor in Hybrik, you need to specify the below image properties in your transcoding job as follows:

  • target/container/kind: "fmp4"
  • target/container/segment_duration_sec: 2
  • target/video/codec: "h264" or "h265"
  • target/video/use_scene_detection: false
  • target/video/use_closed_gop: true

The following FPS are supported according to the support specifications, and target/video/idr_interval/frames must be specified for each FPS as follows:

FPStarget/video/idr_interval/frames
23.976, 2448
2550
29.97, 3060
47.952, 4896
50100
59.94, 60120

Even when using the Segmented Rendering, "duration_sec" must be specified as multiple of 2 seconds or 2.002 seconds depending on the IDR length.

Since it is necessary to generate A/B version files with watermark symbols corresponding to 0 and 1, transcoding must be performed twice for the same original video. To be compatible with Akamai CDN, the B version (symbol 1) file name must be the same as A version (symbol 0) with b. appended before the file name, such as b.<A version file name>. Please refer to the unlabeled A variant part of Akamai guide.

The following is an example when the A version file name is "{source_basename}{default_extension}". The file name can be changed to a value different from the example, but you also need to change the B version file name for the same and add b. at the beginning.

  • A version (symbol 0) file name - target/file_pattern: "{source_basename}{default_extension}"
  • B version (symbol 1) file name - target/file_pattern: "b.{source_basename}{default_extension}"

Also, set the FWM preprocessor plugin and the properties below to preprocess 0 or 1 symbol.

  • target/video/filters/kind: "plugin_docker"
  • target/video/filters/payload/docker_image/image_urn: "public.ecr.aws/pallycon/wm_plugin_pub:latest"
  • target/video/filters/payload/docker_image/registry/kind: "ecr"
  • target/video/filters/payload/config/wm_key_file_base64: "{{wm_key_file_base64}}"
  • target/video/filters/payload/config/wm_access_key: "{{wm_access_key}}"
  • target/video/filters/payload/config/wm_fwm_symbol: 0 or 1

Here’s an example illustrating the application of the above-described FWM preprocessing settings.

{
...,
"payload": {
"elements": [
...,
{
"uid": "transcode_video_wm0_task",
"kind": "transcode",
"payload": {
...,
"targets": [
{
...,
"container": {
"kind": "fmp4",
"segment_duration_sec": "2"
},
"video": {
...,
"use_scene_detection": false,
"use_closed_gop": true,
"frame_rate": "30000/1001",
"idr_interval": {
"frames": 60
},
"filters": [
{
"kind": "plugin_docker",
"payload": {
"docker_image": {
"image_urn": "public.ecr.aws/pallycon/wm_plugin_pub:latest",
"registry": {
"kind": "ecr"
}
},
"config": {
"wm_key_file_base64": "{{wm_key_file_base64}}",
"wm_access_key": "{{wm_access_key}}",
"wm_fwm_symbol": 0
}
}
}
]
},
...
}
]
}
},
{
"uid": "transcode_video_wm1_task",
"kind": "transcode",
"payload": {
...,
"targets": [
{
...,
"container": {
"kind": "fmp4",
"segment_duration_sec": "2"
},
"video": {
...,
"use_scene_detection": false,
"use_closed_gop": true,
"frame_rate": "30000/1001",
"idr_interval": {
"frames": 60
},
"filters": [
{
"kind": "plugin_docker",
"payload": {
"docker_image": {
"image_urn": "public.ecr.aws/pallycon/wm_plugin_pub:latest",
"registry": {
"kind": "ecr"
}
},
"config": {
"wm_key_file_base64": "{{wm_key_file_base64}}",
"wm_access_key": "{{wm_access_key}}",
"wm_fwm_symbol": 1
}
}
}
]
},
...
}
]
}
}
],
...
}
}

Package the generated A/B version mp4 files as DASH and HLS respectively. Please refer to the HLS and DASH Packaging Tutorial from Hybrik for more details.

  • A/B version media segments must be located in the same directory.
  • When users play media, they must play the A version manifest, not the B version. Please be careful not to overwrite the A version manifest with B one. We recommend that the location and name of the B version manifest is different from the A version and delete B version manifest file after packaging.
  • Since the user will play the A version manifest, we only need to include audio in the A version.
  • segmentation_mode must be segmented_mp4 or segmented_ts.

The transcoding output of A version (0) should be connected with A version DASH/HLS packaging, and the output of B version (1) should be connected with B version packaging, respectively.

Please refer to the connection example below:

{
{
...,
"connections": [
{
"from": [
{
"element": "source"
}
],
"to": {
"success": [
{
"element": "transcode_video_wm0_task"
},
{
"element": "transcode_video_wm1_task"
},
{
"element": "transcode_audio_task"
}
]
}
},
{
"from": [
{
"element": "transcode_video_wm0_task"
},
{
"element": "transcode_audio_task"
}
],
"to": {
"success": [
{
"element": "dash_seg_mp4_wm0"
},
{
"element": "hls_seg_ts_wm0"
}
]
}
},
{
"from": [
{
"element": "transcode_video_wm1_task"
}
],
"to": {
"success": [
{
"element": "dash_seg_mp4_wm1"
},
{
"element": "hls_seg_ts_wm1"
}
]
}
}
]
}
}

Execute the transcoding and packaging jobs set through the above process using the Hybrik console or API. The output of the operation is available in the S3 bucket that you specified as the output storage.

A/B(0/1) version of DASH or HLS content created through Hybrik preprocessor can be played by using Session Manager API and CDN integration which enable real-time watermark embedding at playback time. Please refer to the linked guides for details.