Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
02342be
Feature: MPEG-5 LCEVC Scalable support
v-nova-romas Sep 13, 2024
b390b65
Update README.md
sortonjay Sep 17, 2024
34b02d8
Update README.md
sortonjay Sep 17, 2024
1397f4b
Merge branch 'development' into feature/AddLcevcScalableSupport
v-nova-romas Sep 23, 2024
3538ead
Merge remote-tracking branch 'origin/development' into feature/AddLce…
v-nova-romas Oct 1, 2024
7ba8123
Update tests after merging latest changes from development
v-nova-romas Oct 1, 2024
ef8e0dd
Merge branch 'development' into feature/AddLcevcScalableSupport
v-nova-romas Oct 9, 2024
e909c28
Merge branch 'development' into feature/AddLcevcScalableSupport
v-nova-romas Oct 15, 2024
ac687cc
Sort member attributes alphabetically
v-nova-romas Oct 15, 2024
4a3f963
Merge branch 'development' into feature/AddLcevcScalableSupport
v-nova-romas Nov 21, 2024
064329d
Merge branch 'development' into feature/AddLcevcScalableSupport
v-nova-romas Apr 14, 2025
d2c98d4
Update dash.js lib location in Sample pages
v-nova-romas Apr 14, 2025
17ce0fa
Merge branch 'Dash-Industry-Forum:development' into feature/AddLcevcS…
v-nova-romas Jul 30, 2025
49dc8bd
Set enhancement to CmcdObjectType.OTHER
v-nova-romas Aug 5, 2025
b800633
Make enhancement configurable via Settings.js
v-nova-romas Aug 6, 2025
91dd2b4
Update demo contents
v-nova-romas Aug 26, 2025
56b1000
Add Scalable Carriage demo to Reference Player
v-nova-romas Aug 28, 2025
b55db37
Place all samples into root folder lcevc
v-nova-romas Sep 2, 2025
66483c9
Rephrase wording in samples.json
v-nova-romas Sep 2, 2025
6d09eaa
Document EnhancementSettings module
v-nova-romas Sep 2, 2025
6cf68df
Rename to full name codec
v-nova-romas Sep 2, 2025
78ac06f
Check if ExernalSourceBuffer
v-nova-romas Sep 2, 2025
8c6b2fe
Sort setEnhancementStreamProcessor alphabetically
v-nova-romas Sep 2, 2025
3234d6f
Move enhancementStreamProcessor declaration
v-nova-romas Sep 3, 2025
9b4d53c
Rename aData, aStart, anEnd
v-nova-romas Sep 3, 2025
ae253f2
Move to private function _selectMediaInfoForEnhancementStreamProcessor
v-nova-romas Sep 5, 2025
4f610b4
Rename aType to streamProcessorMediaType
v-nova-romas Sep 5, 2025
099f909
Add new attribute dependencyId to save raw values
v-nova-romas Sep 9, 2025
254b36f
Delete unnecessary comment
v-nova-romas Sep 9, 2025
66ebf32
Provide reset method in ExternalMediaSource.js
v-nova-romas Sep 9, 2025
ad70430
Create _prepareQualityChangeForEnhancementStreamProcessor
v-nova-romas Sep 10, 2025
83f31f2
Remove limitation to video in Capabilities.js
v-nova-romas Sep 11, 2025
83d8166
Adjust index.d.ts definitions to add new functions and classes
v-nova-romas Sep 12, 2025
dcd493f
Adjust index.d.ts to include enhancement
v-nova-romas Sep 12, 2025
c655991
Add higher resolution exports and source files for diagrams
v-nova-romas Sep 12, 2025
b900f12
Remove getCurrentRepresentation overload
v-nova-romas Sep 24, 2025
1a5b1db
Remove getAbrRepresentation function
v-nova-romas Sep 24, 2025
64ec29b
Do not resolve dependency in _addRepresentationSwitch
v-nova-romas Sep 24, 2025
d46bc04
Remove documentation to be moved to gh-pages branch
v-nova-romas Sep 25, 2025
4622811
Do not include compatible MediaInfos
v-nova-romas Sep 25, 2025
f43608f
Update unit tests to pass
v-nova-romas Sep 25, 2025
12c2205
Accept whitespace-separated list of values for dependencyId
v-nova-romas Sep 25, 2025
fa10394
Make _getCurrentDependentRepresentation private
v-nova-romas Oct 14, 2025
2627ca9
Add comment for multiple dependency ids
v-nova-romas Oct 14, 2025
3e363e4
Make UI Checkbox more descriptive
v-nova-romas Oct 14, 2025
6f7423a
Trigger GitHub PR refresh
v-nova-romas Oct 14, 2025
868b4bf
Reuse reset function in ExternalMediaSource constructor
v-nova-romas Oct 15, 2025
d6a8865
Fix UI buttons in controlbar being shifted up
v-nova-romas Oct 15, 2025
68d2584
Merge remote-tracking branch 'upstream/development' into feature/AddL…
v-nova-romas Oct 16, 2025
8ef5c85
Cleanup after merge
v-nova-romas Oct 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 178 additions & 0 deletions docs/lcevc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# Scalable LCEVC in dash.js

## Introduction

![Dependent Representations](dependent-representations.png)

This approach creates LCEVC representations which are dependent upon native codec representations (by using dependencyId). LCEVC enhancement representations are contained in a 2nd Adaptation Set and linked to the base representations in the 1st Adaptation Set. The outcome is the ability to play adaptive streaming content where one or more higher resolution profiles are generated by applying LCEVC enhancement to existing conventional profiles saving up to 70% bitrate compared to using conventional standalone native profiles.

An external implementation of the MSE classes MediaSource and SourceBuffer is provided to interject the calls from the enhancement representations. The external SourceBuffer implementation triggers events on buffers appended and removed which the external libraries can listen to.

![Enhancement Stream Processor](enhancement-stream-processor.png)

## Sample player

An example player is available at [https://reference.dashif.org/dash.js/nightly/samples/lcevc-dual-track/lcevc-dual-track.html](https://reference.dashif.org/dash.js/nightly/samples/lcevc-dual-track/lcevc-dual-track.html)

## Manifest format

A separate AdaptationSet is added, alongside the backward compatible video AdaptationSet with the base codec Representations, comprising only the LCEVC Representations with dependencyId that corresponds to the associated base representation.
The AdaptationSet of the dependent representations would have the following attributes:

- @contentType = ‘video’
- @mimeType = ‘video/mp4’
- @codecs = ‘lvc1’
- @frameRate = <<frameRate of base representation>>
- @dependencyId = <<representationId of base representation>>
- @width/height = <LCEVC enhanced video width/height>
- @bandwidth = <combined bit rate of the LCEVC + base representation>
- @sar = <sample aspect ratio as signalled in LCEVC Video Usability Information (VUI)>

## Example manifest

Sample manifest is available at [https://s3.eu-west-1.amazonaws.com/origin-prod-lon-v-nova.com/lcevcDualTrack/1080p30_3Mbps_no_dR/master.mpd](https://s3.eu-west-1.amazonaws.com/origin-prod-lon-v-nova.com/lcevcDualTrack/1080p30_3Mbps_no_dR/master.mpd)

```
<?xml version="1.0" encoding="utf-8"?>
<MPD
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:mpeg:dash:schema:mpd:2011"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd"
type="static"
mediaPresentationDuration="PT10M34.600S"
maxSegmentDuration="PT3S"
minBufferTime="PT10S"
profiles="urn:mpeg:dash:profile:isoff-live:2011,urn:hbbtv:dash:profile:isoff-live:2012">
<Period
id="1"
duration="PT10M34.600S">
<BaseURL>dash/</BaseURL>
<AdaptationSet
id="1"
group="1"
contentType="audio"
segmentAlignment="true"
audioSamplingRate="44100"
mimeType="audio/mp4"
codecs="mp4a.40.2"
startWithSAP="1">
<AudioChannelConfiguration
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011"
value="2" />
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate
timescale="44100"
initialization="out-sorted-$RepresentationID$.dash"
media="out-sorted-$RepresentationID$-$Time$.dash">
<SegmentTimeline>
<S t="0" d="9216" />
...
<S d="62221" />
</SegmentTimeline>
</SegmentTemplate>
<Representation
id="audio=64468"
bandwidth="64468">
</Representation>
</AdaptationSet>
<AdaptationSet
id="2"
group="2"
contentType="video"
par="16:9"
segmentAlignment="true"
width="960"
height="540"
sar="1:1"
frameRate="30"
mimeType="video/mp4"
codecs="avc1.64001F"
startWithSAP="1">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="3" />
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate
timescale="600"
initialization="out-sorted-$RepresentationID$.dash"
media="out-sorted-$RepresentationID$-$Time$.dash">
<SegmentTimeline>
<S t="0" d="120" />
...
<S d="1100" />
</SegmentTimeline>
</SegmentTemplate>
<Representation
id="video=1510172"
bandwidth="1510172"
scanType="progressive">
</Representation>
</AdaptationSet>
<AdaptationSet
id="3"
group="2"
contentType="video"
par="16:9"
segmentAlignment="true"
width="1920"
height="1080"
sar="1:1"
mimeType="video/mp4"
codecs="lvc1"
startWithSAP="1">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="2" />
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate
timescale="15360"
initialization="out-sorted-$RepresentationID$.dash"
media="out-sorted-$RepresentationID$-$Time$.dash">
<SegmentTimeline>
<S t="0" d="3072" />
...
<S d="28160" />
</SegmentTimeline>
</SegmentTemplate>
<Representation
id="video_1=1544000"
bandwidth="3054172"
dependencyId="video=1510172"
frameRate="30"
mimeType="video/mp4"
scanType="unknown">
</Representation>
</AdaptationSet>
</Period>
</MPD>
```

## Encoding LCEVC-enhanced content with ffmpeg

Instructions on how to use ffmpeg to encode LCEVC are available here [https://docs.v-nova.com/v-nova/lcevc/reference-applications/ffmpeg](https://docs.v-nova.com/v-nova/lcevc/reference-applications/ffmpeg).

## Example script to generate scalable LCEVC for MPEG-DASH delivery

```
LD_LIBRARY_PATH=./ffmpeg ./ffmpeg/ffmpeg.exe -y -i bbb_sunflower_2160p_30fps_normal.mp4 -c:v lcevc_h264 -base_encoder x264 -strict -2 -acodec aac -ar 44100 -ac 2 -ab 64k -b:v 3000000 -g 60 -separate_track 1 -eil_params "rc_pcrf_base_prop=0.65;encoding_debug_residuals=1" -pix_fmt yuv420p -r 30 -s 1920x1080 out1.mp4
# Generate .ismv file out of the encodes.
mp4split -o out-sorted.ismv \
out1.mp4
# Generate .ism manifest from the ismv file.
mp4split -o out-sorted.ism \
out-sorted.ismv
# Generate dash files locally this should generate a manifest.mpd
mp4split \
--store-mpd \
-o manifest.mpd \
out-sorted.ism
# Generate Final manifest with addition of dependencyID and supplemental properties
manifest_edit \
-o finalManifest.mpd \
--python_pipeline_config=/etc/manifest-edit/conf/mpd/default.yaml \
out-sorted.mpd
```
Binary file added docs/lcevc/dependent-representations.png
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please create a higher resolution export of this diagram. Ideally, can you also provide the source files for it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a higher resolution export and source files for the diagram, thank you!

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/lcevc/enhancement-stream-processor.png
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please create a higher resolution export of this diagram. Ideally, can you also provide the source files for it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a higher resolution export and source files for the diagram, thank you!

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading