Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: teletext formatting #1384

Merged
merged 8 commits into from
Apr 29, 2024
Merged

Conversation

tobbee
Copy link
Contributor

@tobbee tobbee commented Apr 12, 2024

This PR adds parsing of teletext styling, and rendering of the styling in output TTML and WebVTT subtitle tracks.

It is split into three commits, one for parsing teletext, one for TTML (stpp) generation and a third for WebVTT (wvtt) generation.

Beyond unit tests, I've used the sample https://drive.google.com/file/d/19ZYsoeUfH85gEilQkaAdLbPhC4CxhDEh/view?usp=sharing which has rather advanced subtitling with two separate rows at the same time, where one is left aligned and another is right aligned. This necessitates two parallel cues to be rendered. It also has some colored text.

This should solve #1335.

Commit 1: parse teletext styling and formatting

Extend the teletext parser to parse the teletext styling and formatting.
This includes translating rows into regions, calculating alignment
from start and stop position of the text, and extracting text and
background colors.

The colors are limited to full lines.
Both lines and regions are propagated in the TextSample structures.
This is because the number of lines may differ from different sources.
For teletext, there are 24 rows, but they are essentially always
used with double height, so the number of output lines is 12
from 0 to 11.
There are also corresponding regions are denoted "ttx_R",
where R is an integer row number. A renderer can use either
the line number or the region ID to render the text.

Commit 2: ttml generation for teletext to EBU-TT-D

Add support to render teletext input in EBU-TT-D (IMSC-1) format.
This includes appropriate regions ttx_0 to ttx_11 signalled
in the TextSamples, alignment and text and background colors.

The general TTML output has been changed to always include
metadata, layout, and styling nodes, even if they are empty.

EBU-TT-D is detected by the presence of "ttx_?" regions in the
samples. If detected, extra TTML elements will be added and
the EBU-TT-D linePadding used as well.

Appropriate styles for background and text colors are generated
depending on the color and backgroundColor attributes in the
text fragments.

Commit 3 fix: adapt WebVTT output to teletext TextSample.

Teletext input generates both a region with prefix ttx_
and a floating point line number (e.g. 9.5) in the
range 0 to 11.5 (due to input 0-23 as double lines).

The output is adopted to drop such regions
and convert the line number to an integer
since the standard only used floats for percent
values but not for plain line numbers.

Copy link
Contributor

@cosmin cosmin left a comment

Choose a reason for hiding this comment

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

Please rebase as this will include integration tests in CI and hopefully fix the build failures on this PR on Windows and OS X.

packager/media/formats/mp2t/es_parser_teletext.cc Outdated Show resolved Hide resolved
Extend the teletext parser to parse the teletext styling and formatting.
This includes translating rows into regions, calculating alignment
from start and stop position of the text, and extracting text and
background colors.

The colors are limited to full lines.
Both lines and regions are propagated in the TextSample structures.
This is because the number of lines may differ from different sources.
For teletext, there are 24 rows, but they are essentially always
used with double height, so the number of output lines is 12
from 0 to 11.
There are also corresponding regions are denoted "ttx_R",
where R is an integer row number. A renderer can use either
the line number or the region ID to render the text.
Add support to render teletext input in EBU-TT-D (IMSC-1) format.
This includes appropriate regions ttx_0 to ttx_11 signalled
in the TextSamples, alignment and text and background colors.

The general TTML output has been changed to always include
metadata, layout, and styling nodes, even if they are empty.

EBU-TT-D is detected by the presence of "ttx_?" regions in the
samples. If detected, extra TTML elements will be added and
the EBU-TT-D linePadding used as well.

Appropriate styles for background and text colors are generated
depending on the color and backgroundColor attributes in the
text fragments.
Teletext input generates both a region with prefix ttx_
and a floating point line number (e.g. 9.5) in the
range 0 to 11.5 (due to input 0-23 as double lines).

The output is adopted to drop such regions
and convert the line number to an integer
since the standard only used floats for percent
values but not for plain line numbers.
@cosmin
Copy link
Contributor

cosmin commented Apr 22, 2024

Looks like the existing TTML integration tests are failing. You can run the tests locally with python3 build/packager/packager_test.py. If the expectation files need to be updated due to improved behavior, you can run python3 build/packager/packager_test.py --test_update_golden_files and then verify that all the produced differences are expected.

@tobbee
Copy link
Contributor Author

tobbee commented Apr 23, 2024

@cosmin Thanks for the note. I only made the unit tests work and missed the integration test.

I've now updated all the test TTML assets. The main difference is that the head element of all TTML
output now contains head, styling, and layout elements. In the test material these are empty,
but I don't think it is worth the effort to remove them if empty, since they are standard elements of TTML.

@cosmin
Copy link
Contributor

cosmin commented Apr 23, 2024

@tobbee thank you, if all the CI jobs pass I'll go ahead and merge this

@cosmin
Copy link
Contributor

cosmin commented Apr 24, 2024

The build is failing on Windows

D:\a\shaka-packager\shaka-packager\packager\media\formats\ttml\ttml_generator.cc(59,14): error C2220: the following warning is treated as an error [D:\a\shaka-packager\shaka-packager\build\packager\media\formats\ttml\ttml.vcxproj]
D:\a\shaka-packager\shaka-packager\packager\media\formats\ttml\ttml_generator.cc(59,14): warning C4305: 'initializing': truncation from 'double' to 'float' [D:\a\shaka-packager\shaka-packager\build\packager\media\formats\ttml\ttml.vcxproj]

@tobbee
Copy link
Contributor Author

tobbee commented Apr 25, 2024

I talked to a real subtitle expert, and we should suppress the warning for bad data length, since it is stuffing that should be there if the TS stream is compliant with the DVB teletext spec. Apparently, the spec says that one cannot stuff on PES level, but must fill an integral number of TS packets with teletext PES data. I checked and all the payload bytes of this trailing chunk of 136 bytes are indeed stuffing 0xff in my test stream.

I'll update this PR.

@tobbee tobbee marked this pull request as draft April 25, 2024 05:45
@tobbee
Copy link
Contributor Author

tobbee commented Apr 25, 2024

Turns out that the stuffing has a different data_unit_id, so by first checking that value before the length, we get rid of the warnings and only have an error if a teletext data unit has wrong length. I added another commit to fix that so this PR should now be fine for merging.

@tobbee tobbee marked this pull request as ready for review April 25, 2024 20:09
@cosmin cosmin added this to the v3.1 milestone Apr 26, 2024
@cosmin cosmin added type: enhancement New feature or request component: text The issue involves text streams (subtitles or captions) labels Apr 26, 2024
@cosmin cosmin merged commit 4b5e80d into shaka-project:main Apr 29, 2024
38 checks passed
cosmin pushed a commit that referenced this pull request May 4, 2024
🤖 I have created a release *beep* *boop*
---


##
[3.1.0](v3.0.4...v3.1.0)
(2024-05-03)


### Features

* add missing DASH roles from ISO/IEC 23009-1 section 5.8.5.5
([#1390](#1390))
([fe885b3](fe885b3))
* get start number from muxer and specify initial sequence number
([#879](#879))
([bb104fe](bb104fe))
* teletext formatting
([#1384](#1384))
([4b5e80d](4b5e80d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
@github-actions github-actions bot added the status: archived Archived and locked; will not be updated label Jun 28, 2024
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jun 28, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
component: text The issue involves text streams (subtitles or captions) status: archived Archived and locked; will not be updated type: enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants