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

[Proposal] Adding an option to enable/disable X-TIMESTAMP-MAP in WebVTT #1127

Open
7 of 10 tasks
ozt860071 opened this issue Nov 22, 2019 · 27 comments
Open
7 of 10 tasks

Comments

@ozt860071
Copy link

Please prefix your issue with one of the following: [BUG], [PROPOSAL], [QUESTION].

CCExtractor version (using the --version parameter preferably) : X.X

In raising this issue, I confirm the following (please check boxes, eg [X] - and delete unchecked ones):

  • I have read and understood the contributors guide.
  • I have checked that the bug-fix I am reporting can be replicated, or that the feature I am suggesting isn't already present.
  • I have checked that the issue I'm posting isn't already reported.
  • I have checked that the issue I'm porting isn't already solved and no duplicates exist in closed issues and in opened issues
  • I have checked the pull requests tab for existing solutions/implementations to my issue/suggestion.
  • I have used the latest available version of CCExtractor to verify this issue exists.

My familiarity with the project is as follows (check one, eg [X] - and delete unchecked ones):

  • I have never used CCExtractor.
  • I have used CCExtractor just a couple of times.
  • I absolutely love CCExtractor, but have not contributed previously.
  • I am an active contributor to CCExtractor.

Necessary information

  • Is this a regression (did it work before)? [x] NO | [ ] YES - please specify the last known working version
  • What platform did you use? [ ] Windows - [ ] Linux - [x] Mac
  • What were the used arguments? -out=webvtt

Video links (replace text below with your links)

Additional information
Currently when WebVTT is specified as output, X-TIMESTAMP-MAP is automatically added. And if no subtitle text is found in the input, it generates an empty WebVTT, with just one line "WEBVTT" in the file.

There are potentially two issues with this implementation.
(a) X-TIMESTAMP-MAP is not a WebVTT requirement, but Apple HLS requirement, this may cause a problem if it is used in non-HLS environment. It should be an option to turn it off.
(b) On the other hand, Apple HLS spec says "an X-TIMESTAMP-MAP metadata header SHOULD be added to each WebVTT header", which includes the empty ones. The spec also says "If a WebVTT segment does not have the X-TIMESTAMP-MAP, the client MUST assume that the WebVTT cue time of 0 maps to an MPEG-2 timestamp of 0.". But unfortunately, not all clients follow this rule. It is safer to add X-TIMESTAMP-MAP in all VTT files, if it is enabled.

So, my proposal is to add an option for WebVTT, whether X-TIMESTAMP-MAP is enabled or disabled. And if it is enabled, it will be added in every VTT file it generates, including one with no caption cues.

(cf. "HTTP Live Streaming": https://tools.ietf.org/html/rfc8216 section 3.5)

@cfsmp3 cfsmp3 added the GCI19 label Nov 30, 2019
@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 4, 2019

What happens if X-TIMESTAMP-MAP is disabled and the WebVTT cue time 0 doesn't map to an MPEG-2 timestamp of 0?

@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 4, 2019

What would be the reason to not have the X-TIMESTAMP-MAP?

@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 4, 2019

Wouldn't it be better to have the X-TIMESTAMP-MAP header present all the time?

@ozt860071
Copy link
Author

ozt860071 commented Dec 5, 2019 via email

@ozt860071
Copy link
Author

ozt860071 commented Dec 5, 2019 via email

@ozt860071
Copy link
Author

ozt860071 commented Dec 5, 2019 via email

@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 5, 2019

@cfsmp3 What should I do? I feel like the best here is to always use X-TIMESTAMP-MAP.

@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 5, 2019

There is also the general problem that ccextractor creates files even when it can't find anything making this problem more general and not limited to .vtt. @cfsmp3

@ozt860071
Copy link
Author

ozt860071 commented Dec 5, 2019 via email

@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 5, 2019

The client needs the get the timing info from X-TIMESTAMP-MAP for synchronization.

why would you need to synchronize if you don't have subtitles?

@cfsmp3
Copy link
Contributor

cfsmp3 commented Dec 6, 2019

The client needs the get the timing info from X-TIMESTAMP-MAP for synchronization.

why would you need to synchronize if you don't have subtitles?

It's part of the HLS specification. If there are subtitles in WebVTT:

Subtitles

  1. Subtitle requirements
    5.1. Subtitles MAY be provided.
    5.2. Subtitles MUST be WebVTT (according to the HLS specification) or IMSC1 in fMP4.
    5.3. WebVTT subtitles MUST be in text files, with an X-TIMESTAMP-MAP according to the HLS specification.

References:
https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices
https://tools.ietf.org/html/rfc8216#page-13

Note that Apple there says MUST (in 5.2) but the RPC8216 says SHOULD.
But still, if we generate a .vtt file, even if it has no subtitles, it should have the required header. Otherwise players may refuse to play anything at all.

@NilsIrl
Copy link
Contributor

NilsIrl commented Dec 6, 2019

The thing is that you can't synchronize between 2 things when you're missing 1 of the 2, in this case subtitles.

@cfsmp3
Copy link
Contributor

cfsmp3 commented Dec 6, 2019

An empty subtitle file is not the same as no subtitle file. If there's a subtitle file even if it has no actual subtitles inside you need to be able to know where it starts relative to the video.

In any case if the specs say that's the way it is then that's what we have to implement, unless you want to get in touch (you can) with the RFC8216 writers and discuss :-)

Otherwise we're just not standard compliant and that's not a good thing to be. In fact, if you read the RFC you will see that in a bunch of places it says that clients MUST refuse to play media that is not compliant. Not that they should do their best to play it anyway, but the opposite.

And well, there's a good reason for that: To force all programs generating media to follow the specs.

@NilsIrl
Copy link
Contributor

NilsIrl commented Jan 12, 2020

If there's a subtitle file even if it has no actual subtitles inside you need to be able to know where it starts relative to the video.

  1. As in where the subtitles are located in the video file in bytes.
  2. Or as in the timestamp at which the subtitles start in seconds (or the duration unit that is used).

@cfsmp3
Copy link
Contributor

cfsmp3 commented Jan 12, 2020

You want to sync using time, not bytes. There's some reasons for this, one of them being that you might be starting the stream in the middle and not have access to anything before you started playing - for example, when you turn on your TV your TV needs to start playing the stream from the point you turn it on, Also, the stream never ends...

Second, even if we were talking about actual files with a beginning and an end, they will contain at the very least 1 video track and 1 audio track (possibly more of audio), so what byte offset would you use?

@NilsIrl
Copy link
Contributor

NilsIrl commented Jan 12, 2020

In case 1, the value would just be metadata that would kinda be useless without the exact same video file.

For example in the East Enders file here is the header:

X-TIMESTAMP-MAP=MPEGTS:1090971027,LOCAL:00:00:00.000

MPEGTS is the duration since the start of the stream (before the start of the video file)?

@cfsmp3
Copy link
Contributor

cfsmp3 commented Jan 12, 2020 via email

@kdrag0n
Copy link
Contributor

kdrag0n commented Jan 21, 2020

Shouldn't this issue be closed since #1176 has been merged?

@cfsmp3 cfsmp3 closed this as completed Jan 21, 2020
@NilsIrl
Copy link
Contributor

NilsIrl commented Jan 21, 2020

Well the underlying issue is still present so it doesn't solve the original problem

(THE header doesn't show up all the time). I'm going to reopen my PR

@cfsmp3 cfsmp3 reopened this Jan 21, 2020
@NilsIrl
Copy link
Contributor

NilsIrl commented Jan 22, 2020

Is there a file I can test it with? (a file without subtitles).

@cfsmp3
Copy link
Contributor

cfsmp3 commented Jan 25, 2020

Is there a file I can test it with? (a file without subtitles).

You can use any file - just manually select --datapid pointing to a PID that is not present in the stream.

@NilsIrl
Copy link
Contributor

NilsIrl commented Feb 15, 2020

You can use any file - just manually select --datapid pointing to a PID that is not present in the stream.

This shouldn't affect the header right?

@NilsIrl
Copy link
Contributor

NilsIrl commented Feb 15, 2020

https://github.com/NilsIrl/ccextractor/blob/db646f50ac14a772de9f374b2b40e05dbc6c0da9/src/lib_ccx/general_loop.c#L991-L1006

If you look at the above snippet, data_node == NULL when a wrong -datapid is set. The thing is that in order to get the value for X-TIMESTAMP-MAP, data_node needs to be used. I don't know if the problem has to do with the fact -datapid is used. From what I understand it's not the fact we don't have subtitles that prevents from having a correct X-TIMESTAMP-MAP so it should be possible.

@cfsmp3
Copy link
Contributor

cfsmp3 commented Feb 15, 2020

OK so cheating with datapid is not an an option :-(

Check out our list of samples.
https://drive.google.com/drive/folders/0B_61ywKPmI0TUUk5LXJPeG1feFE?usp=sharing

Specifically the UK TV one has one that says "no subs"

@ozt860071
Copy link
Author

Sorry not to see this in 0.89.
(from CHANGES.TXT)

@cfsmp3
Copy link
Contributor

cfsmp3 commented Jun 22, 2021

Sorry not to see this in 0.89.
(from CHANGES.TXT)

https://github.com/CCExtractor/ccextractor/pull/1176/files

@ozt860071
Copy link
Author

As you mentioned,

Note that Apple there says MUST (in 5.2) but the RPC8216 says SHOULD.
But still, if we generate a .vtt file, even if it has no subtitles, it should have the required header. Otherwise players may refuse to play anything at all.

This needs to be resolved. I think the code is ready.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants