@@ -7324,15 +7324,6 @@ static int mov_init(AVFormatContext *s)
track->squash_fragment_samples_to_one =
ff_is_ttml_stream_paragraph_based(track->par);
- if (mov->flags & FF_MOV_FLAG_FRAGMENT &&
- track->squash_fragment_samples_to_one) {
- av_log(s, AV_LOG_ERROR,
- "Fragmentation is not currently supported for "
- "TTML in MP4/ISMV (track synchronization between "
- "subtitles and other media is not yet implemented)!\n");
- return AVERROR_PATCHWELCOME;
- }
-
if (track->mode != MODE_ISM &&
track->par->codec_tag == MOV_ISMV_TTML_TAG &&
s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) {
@@ -54,6 +54,50 @@ static int mov_init_ttml_writer(MOVTrack *track, AVFormatContext **out_ctx)
return 0;
}
+static void mov_calculate_start_and_end_of_other_tracks(
+ AVFormatContext *s, MOVTrack *track, int64_t *start_pts, int64_t *end_pts)
+{
+ MOVMuxContext *mov = s->priv_data;
+
+ // Initialize at the end of the previous document/fragment, which is NOPTS
+ // until the first fragment is created.
+ int64_t max_track_end_dts = *start_pts = track->end_pts;
+
+ for (unsigned int i = 0; i < s->nb_streams; i++) {
+ MOVTrack *other_track = &mov->tracks[i];
+
+ // Skip our own track, any other track that needs squashing,
+ // or any track which still has its start_dts at NOPTS or
+ // any track that did not yet get any packets.
+ if (track == other_track ||
+ other_track->squash_fragment_samples_to_one ||
+ other_track->start_dts == AV_NOPTS_VALUE ||
+ !other_track->entry) {
+ continue;
+ }
+
+ {
+ int64_t picked_start = av_rescale_q_rnd(other_track->cluster[0].dts + other_track->cluster[0].cts,
+ other_track->st->time_base,
+ track->st->time_base,
+ AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);
+ int64_t picked_end = av_rescale_q_rnd(other_track->end_pts,
+ other_track->st->time_base,
+ track->st->time_base,
+ AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);
+
+ if (*start_pts == AV_NOPTS_VALUE)
+ *start_pts = picked_start;
+ else if (picked_start >= track->end_pts)
+ *start_pts = FFMIN(*start_pts, picked_start);
+
+ max_track_end_dts = FFMAX(max_track_end_dts, picked_end);
+ }
+ }
+
+ *end_pts = max_track_end_dts;
+}
+
static int mov_write_ttml_document_from_queue(AVFormatContext *s,
AVFormatContext *ttml_ctx,
MOVTrack *track,
@@ -65,13 +109,85 @@ static int mov_write_ttml_document_from_queue(AVFormatContext *s,
int64_t start_ts = track->start_dts == AV_NOPTS_VALUE ?
0 : (track->start_dts + track->track_duration);
int64_t end_ts = start_ts;
+ unsigned int time_limited = 0;
+ PacketList back_to_queue_list = { 0 };
+
+ if (*out_start_ts != AV_NOPTS_VALUE) {
+ // we have non-nopts values here, thus we have been given a time range
+ time_limited = 1;
+ start_ts = *out_start_ts;
+ end_ts = *out_start_ts + *out_duration;
+ }
if ((ret = avformat_write_header(ttml_ctx, NULL)) < 0) {
return ret;
}
while (!avpriv_packet_list_get(&track->squashed_packet_queue, pkt)) {
- end_ts = FFMAX(end_ts, pkt->pts + pkt->duration);
+ int64_t pts_before = pkt->pts;
+ int64_t duration_before = pkt->duration;
+
+ if (time_limited) {
+ // special cases first:
+ if (pkt->pts + pkt->duration < start_ts) {
+ // too late for our fragment, unfortunately
+ // unref and proceed to next packet in queue.
+ av_log(s, AV_LOG_WARNING,
+ "Very late TTML packet in queue, dropping packet with "
+ "pts: %"PRId64", duration: %"PRId64"\n",
+ pkt->pts, pkt->duration);
+ av_packet_unref(pkt);
+ continue;
+ } else if (pkt->pts >= end_ts) {
+ // starts after this fragment, put back to original queue
+ ret = avpriv_packet_list_put(&track->squashed_packet_queue,
+ pkt, av_packet_ref,
+ FF_PACKETLIST_FLAG_PREPEND);
+ if (ret < 0)
+ goto cleanup;
+
+ break;
+ }
+
+ // limit packet pts to start_ts
+ if (pkt->pts < start_ts) {
+ pkt->duration -= start_ts - pkt->pts;
+ pkt->pts = start_ts;
+ }
+
+ if (pkt->pts + pkt->duration > end_ts) {
+ // goes over our current fragment, create duplicate and
+ // put it back to list after iteration has finished in
+ // order to handle multiple subtitles at the same time.
+ int64_t offset = end_ts - pkt->pts;
+
+ ret = avpriv_packet_list_put(&back_to_queue_list,
+ pkt, av_packet_ref,
+ FF_PACKETLIST_FLAG_PREPEND);
+ if (ret < 0)
+ goto cleanup;
+
+ back_to_queue_list.head->pkt.pts =
+ back_to_queue_list.head->pkt.dts =
+ back_to_queue_list.head->pkt.pts + offset;
+ back_to_queue_list.head->pkt.duration -= offset;
+
+ // and for our normal packet we just set duration to offset
+ pkt->duration = offset;
+ }
+ } else {
+ end_ts = FFMAX(end_ts, pkt->pts + pkt->duration);
+ }
+
+ av_log(s, AV_LOG_TRACE,
+ "TTML packet writeout: pts: %"PRId64" (%"PRId64"), "
+ "duration: %"PRId64"\n",
+ pkt->pts, pkt->pts - start_ts, pkt->duration);
+ if (pkt->pts != pts_before || pkt->duration != duration_before) {
+ av_log(s, AV_LOG_TRACE,
+ "Adjustments: pts: %"PRId64", duration: %"PRId64"\n",
+ pkt->pts - pts_before, pkt->duration - duration_before);
+ }
// in case of the 'dfxp' muxing mode, each written document is offset
// to its containing sample's beginning.
@@ -100,15 +216,30 @@ static int mov_write_ttml_document_from_queue(AVFormatContext *s,
ret = 0;
cleanup:
+ while (!avpriv_packet_list_get(&back_to_queue_list, pkt)) {
+ ret = avpriv_packet_list_put(&track->squashed_packet_queue,
+ pkt, av_packet_ref,
+ FF_PACKETLIST_FLAG_PREPEND);
+
+ // unrelated to whether we succeed or not, we unref the packet
+ // received from the temporary list.
+ av_packet_unref(pkt);
+
+ if (ret < 0) {
+ avpriv_packet_list_free(&back_to_queue_list);
+ break;
+ }
+ }
return ret;
}
int ff_mov_generate_squashed_ttml_packet(AVFormatContext *s,
MOVTrack *track, AVPacket *pkt)
{
+ MOVMuxContext *mov = s->priv_data;
AVFormatContext *ttml_ctx = NULL;
// values for the generated AVPacket
- int64_t start_ts = 0;
+ int64_t start_ts = AV_NOPTS_VALUE;
int64_t duration = 0;
int ret = AVERROR_BUG;
@@ -119,12 +250,30 @@ int ff_mov_generate_squashed_ttml_packet(AVFormatContext *s,
goto cleanup;
}
+ if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
+ int64_t calculated_start = AV_NOPTS_VALUE;
+ int64_t calculated_end = AV_NOPTS_VALUE;
+
+ mov_calculate_start_and_end_of_other_tracks(s, track, &calculated_start, &calculated_end);
+
+ if (calculated_start != AV_NOPTS_VALUE) {
+ start_ts = calculated_start;
+ duration = calculated_end - calculated_start;
+ av_log(s, AV_LOG_VERBOSE,
+ "Calculated subtitle fragment start: %"PRId64", "
+ "duration: %"PRId64"\n",
+ start_ts, duration);
+ }
+ }
+
if (!track->squashed_packet_queue.head) {
// empty queue, write minimal empty document with zero duration
avio_write(ttml_ctx->pb, empty_ttml_document,
sizeof(empty_ttml_document) - 1);
- start_ts = 0;
- duration = 0;
+ if (start_ts == AV_NOPTS_VALUE) {
+ start_ts = 0;
+ duration = 0;
+ }
goto generate_packet;
}
@@ -143,6 +143,27 @@ FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, TTML SUBRIP, MP4 MOV, SRT_DEMUXER TTML
fate-mov-mp4-ttml-stpp: CMD = transcode srt $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt mp4 "-map 0:s -c:s ttml -time_base:s 1:1000" "-map 0 -c copy" "-of json -show_entries packet:stream=index,codec_type,codec_tag_string,codec_tag,codec_name,time_base,start_time,duration_ts,duration,nb_frames,nb_read_packets:stream_tags"
fate-mov-mp4-ttml-dfxp: CMD = transcode srt $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt mp4 "-map 0:s -c:s ttml -time_base:s 1:1000 -tag:s dfxp -strict unofficial" "-map 0 -c copy" "-of json -show_entries packet:stream=index,codec_type,codec_tag_string,codec_tag,codec_name,time_base,start_time,duration_ts,duration,nb_frames,nb_read_packets:stream_tags"
+FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, TTML SUBRIP, MP4 MOV, LAVFI_INDEV SMPTEHDBARS_FILTER SRT_DEMUXER MPEG2VIDEO_ENCODER TTML_MUXER RAWVIDEO_MUXER) += fate-mov-mp4-fragmented-ttml-stpp
+fate-mov-mp4-fragmented-ttml-stpp: CMD = transcode srt $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt mp4 \
+ "-map 1:v -map 0:s \
+ -c:v mpeg2video -b:v 2M -g 48 -sc_threshold 1000000000 \
+ -c:s ttml -time_base:s 1:1000 \
+ -movflags +cmaf" \
+ "-map 0:s -c copy" \
+ "-select_streams s -of csv -show_packets -show_data_hash crc32" \
+ "-f lavfi -i smptehdbars=duration=24.5245:size=320x180:rate=24000/1001,format=yuv420p" \
+ "" "" "data"
+
+FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, TTML SUBRIP, ISMV MOV, LAVFI_INDEV SMPTEHDBARS_FILTER SRT_DEMUXER MPEG2VIDEO_ENCODER TTML_MUXER RAWVIDEO_MUXER) += fate-mov-mp4-fragmented-ttml-dfxp
+fate-mov-mp4-fragmented-ttml-dfxp: CMD = transcode srt $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt ismv \
+ "-map 1:v -map 0:s \
+ -c:v mpeg2video -b:v 2M -g 48 -sc_threshold 1000000000 \
+ -c:s ttml -tag:s dfxp -time_base:s 1:1000" \
+ "-map 0:s -c copy" \
+ "-select_streams s -of csv -show_packets -show_data_hash crc32" \
+ "-f lavfi -i smptehdbars=duration=24.5245:size=320x180:rate=24000/1001,format=yuv420p" \
+ "" "" "data"
+
# FIXME: Uncomment these two tests once the test files are uploaded to the fate
# server.
# avif demuxing - still image with 1 item.
new file mode 100644
@@ -0,0 +1,430 @@
+a66a4ee35d00af1304847d4897aa2615 *tests/data/fate/mov-mp4-fragmented-ttml-dfxp.ismv
+189404 tests/data/fate/mov-mp4-fragmented-ttml-dfxp.ismv
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.000"><span region="Default">Don't show this text it may be used to insert hidden data</span></p>
+ <p
+ begin="00:00:01.500"
+ end="00:00:02.002"><span region="Default">SubRip subtitles capability tester 1.3o by ale5000<br/>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others<br/>This text should be blue<br/>This text should be red<br/>This text should be black<br/>If you see this with the normal font, the player don't (fully) support font face</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:02.002"><span region="Default">SubRip subtitles capability tester 1.3o by ale5000<br/>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others<br/>This text should be blue<br/>This text should be red<br/>This text should be black<br/>If you see this with the normal font, the player don't (fully) support font face</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.496"><span region="Default">SubRip subtitles capability tester 1.3o by ale5000<br/>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others<br/>This text should be blue<br/>This text should be red<br/>This text should be black<br/>If you see this with the normal font, the player don't (fully) support font face</span></p>
+ <p
+ begin="00:00:00.496"
+ end="00:00:00.496"><span region="Default">Hidden</span></p>
+ <p
+ begin="00:00:00.497"
+ end="00:00:02.002"><span region="Default">This text should be small<br/>This text should be normal<br/>This text should be big</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:01.494"><span region="Default">This text should be small<br/>This text should be normal<br/>This text should be big</span></p>
+ <p
+ begin="00:00:01.495"
+ end="00:00:02.002"><span region="Default">This should be an E with an accent: È<br/>日本語<br/>This text should be bold, italics and underline<br/>This text should be small and green<br/>This text should be small and red<br/>This text should be big and brown</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:02.002"><span region="Default">This should be an E with an accent: È<br/>日本語<br/>This text should be bold, italics and underline<br/>This text should be small and green<br/>This text should be small and red<br/>This text should be big and brown</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:01.490"><span region="Default">This should be an E with an accent: È<br/>日本語<br/>This text should be bold, italics and underline<br/>This text should be small and green<br/>This text should be small and red<br/>This text should be big and brown</span></p>
+ <p
+ begin="00:00:01.491"
+ end="00:00:02.002"><span region="Default">This line should be bold<br/>This line should be italics<br/>This line should be underline<br/>This line should be strikethrough<br/>Both lines<br/>should be underline</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:02.002"><span region="Default">This line should be bold<br/>This line should be italics<br/>This line should be underline<br/>This line should be strikethrough<br/>Both lines<br/>should be underline</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.486"><span region="Default">This line should be bold<br/>This line should be italics<br/>This line should be underline<br/>This line should be strikethrough<br/>Both lines<br/>should be underline</span></p>
+ <p
+ begin="00:00:00.487"
+ end="00:00:02.002"><span region="Default">><br/>It would be a good thing to<br/>hide invalid html tags that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>Show not opened tags<br/><</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:01.484"><span region="Default">><br/>It would be a good thing to<br/>hide invalid html tags that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>Show not opened tags<br/><</span></p>
+ <p
+ begin="00:00:01.485"
+ end="00:00:02.002"><span region="Default">and also<br/>hide invalid html tags with parameters that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>This text should be showed underlined without problems also: 2<3,5>1,4<6<br/>This shouldn't be underlined</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:02.002"><span region="Default">and also<br/>hide invalid html tags with parameters that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>This text should be showed underlined without problems also: 2<3,5>1,4<6<br/>This shouldn't be underlined</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.480"><span region="Default">and also<br/>hide invalid html tags with parameters that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>This text should be showed underlined without problems also: 2<3,5>1,4<6<br/>This shouldn't be underlined</span></p>
+ <p
+ begin="00:00:00.481"
+ end="00:00:01.480"><span region="Default">This text should be in the normal position...</span></p>
+ <p
+ begin="00:00:01.481"
+ end="00:00:02.002"><span region="Default">This text should NOT be in the normal position</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.478"><span region="Default">This text should NOT be in the normal position</span></p>
+ <p
+ begin="00:00:00.479"
+ end="00:00:02.002"><span region="Default">Implementation is the same of the ASS tag<br/>This text should be at the<br/>top and horizontally centered</span></p>
+ <p
+ begin="00:00:00.479"
+ end="00:00:02.002"><span region="Default">This text should be at the<br/>middle and horizontally centered</span></p>
+ <p
+ begin="00:00:00.479"
+ end="00:00:02.002"><span region="Default">This text should be at the<br/>bottom and horizontally centered</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.476"><span region="Default">Implementation is the same of the ASS tag<br/>This text should be at the<br/>top and horizontally centered</span></p>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.476"><span region="Default">This text should be at the<br/>middle and horizontally centered</span></p>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.476"><span region="Default">This text should be at the<br/>bottom and horizontally centered</span></p>
+ <p
+ begin="00:00:00.477"
+ end="00:00:00.501"><span region="Default">This text should be at the<br/>top and horizontally at the left</span></p>
+ <p
+ begin="00:00:00.477"
+ end="00:00:00.500"><span region="Default">This text should be at the<br/>middle and horizontally at the left<br/>(The second position must be ignored)</span></p>
+ <p
+ begin="00:00:00.477"
+ end="00:00:00.500"><span region="Default">This text should be at the<br/>bottom and horizontally at the left</span></p>
+ </div>
+ </body>
+</tt>
+packet,subtitle,1,0,0.000000,0,0.000000,N/A,N/A,1172,14746,K__,CRC32:bde7afa1
+packet,subtitle,1,20020000,2.002000,20020000,2.002000,N/A,N/A,1015,29540,K__,CRC32:c1cb78f2
+packet,subtitle,1,40040000,4.004000,40040000,4.004000,N/A,N/A,1305,44177,K__,CRC32:267b17fe
+packet,subtitle,1,60060000,6.006000,60060000,6.006000,N/A,N/A,1111,59104,K__,CRC32:d6aaf284
+packet,subtitle,1,80080000,8.008000,80080000,8.008000,N/A,N/A,927,73837,K__,CRC32:0ee24ad7
+packet,subtitle,1,100100000,10.010000,100100000,10.010000,N/A,N/A,1194,88386,K__,CRC32:a9816515
+packet,subtitle,1,120120000,12.012000,120120000,12.012000,N/A,N/A,874,103202,K__,CRC32:c47ebb4e
+packet,subtitle,1,140140000,14.014000,140140000,14.014000,N/A,N/A,1154,117698,K__,CRC32:09b26179
+packet,subtitle,1,160160000,16.016000,160160000,16.016000,N/A,N/A,1240,132474,K__,CRC32:d7e3067e
+packet,subtitle,1,180180000,18.018000,180180000,18.018000,N/A,N/A,960,147336,K__,CRC32:d2d99797
+packet,subtitle,1,200200000,20.020000,200200000,20.020000,N/A,N/A,1251,161918,K__,CRC32:1857892c
+packet,subtitle,1,220220000,22.022000,220220000,22.022000,N/A,N/A,1285,176791,K__,CRC32:76bd9787
+packet,subtitle,1,240240000,24.024000,240240000,24.024000,N/A,N/A,1676,187162,K__,CRC32:b519ec6f
new file mode 100644
@@ -0,0 +1,430 @@
+0b04302a9d3712fda440aa19df59a561 *tests/data/fate/mov-mp4-fragmented-ttml-stpp.mp4
+183872 tests/data/fate/mov-mp4-fragmented-ttml-stpp.mp4
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:00.000"
+ end="00:00:00.000"><span region="Default">Don't show this text it may be used to insert hidden data</span></p>
+ <p
+ begin="00:00:01.500"
+ end="00:00:02.002"><span region="Default">SubRip subtitles capability tester 1.3o by ale5000<br/>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others<br/>This text should be blue<br/>This text should be red<br/>This text should be black<br/>If you see this with the normal font, the player don't (fully) support font face</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:02.002"
+ end="00:00:04.004"><span region="Default">SubRip subtitles capability tester 1.3o by ale5000<br/>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others<br/>This text should be blue<br/>This text should be red<br/>This text should be black<br/>If you see this with the normal font, the player don't (fully) support font face</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:04.004"
+ end="00:00:04.500"><span region="Default">SubRip subtitles capability tester 1.3o by ale5000<br/>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others<br/>This text should be blue<br/>This text should be red<br/>This text should be black<br/>If you see this with the normal font, the player don't (fully) support font face</span></p>
+ <p
+ begin="00:00:04.500"
+ end="00:00:04.500"><span region="Default">Hidden</span></p>
+ <p
+ begin="00:00:04.501"
+ end="00:00:06.006"><span region="Default">This text should be small<br/>This text should be normal<br/>This text should be big</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:06.006"
+ end="00:00:07.500"><span region="Default">This text should be small<br/>This text should be normal<br/>This text should be big</span></p>
+ <p
+ begin="00:00:07.501"
+ end="00:00:08.008"><span region="Default">This should be an E with an accent: È<br/>日本語<br/>This text should be bold, italics and underline<br/>This text should be small and green<br/>This text should be small and red<br/>This text should be big and brown</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:08.008"
+ end="00:00:10.010"><span region="Default">This should be an E with an accent: È<br/>日本語<br/>This text should be bold, italics and underline<br/>This text should be small and green<br/>This text should be small and red<br/>This text should be big and brown</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:10.010"
+ end="00:00:11.500"><span region="Default">This should be an E with an accent: È<br/>日本語<br/>This text should be bold, italics and underline<br/>This text should be small and green<br/>This text should be small and red<br/>This text should be big and brown</span></p>
+ <p
+ begin="00:00:11.501"
+ end="00:00:12.012"><span region="Default">This line should be bold<br/>This line should be italics<br/>This line should be underline<br/>This line should be strikethrough<br/>Both lines<br/>should be underline</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:12.012"
+ end="00:00:14.014"><span region="Default">This line should be bold<br/>This line should be italics<br/>This line should be underline<br/>This line should be strikethrough<br/>Both lines<br/>should be underline</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:14.014"
+ end="00:00:14.500"><span region="Default">This line should be bold<br/>This line should be italics<br/>This line should be underline<br/>This line should be strikethrough<br/>Both lines<br/>should be underline</span></p>
+ <p
+ begin="00:00:14.501"
+ end="00:00:16.016"><span region="Default">><br/>It would be a good thing to<br/>hide invalid html tags that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>Show not opened tags<br/><</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:16.016"
+ end="00:00:17.500"><span region="Default">><br/>It would be a good thing to<br/>hide invalid html tags that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>Show not opened tags<br/><</span></p>
+ <p
+ begin="00:00:17.501"
+ end="00:00:18.018"><span region="Default">and also<br/>hide invalid html tags with parameters that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>This text should be showed underlined without problems also: 2<3,5>1,4<6<br/>This shouldn't be underlined</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:18.018"
+ end="00:00:20.020"><span region="Default">and also<br/>hide invalid html tags with parameters that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>This text should be showed underlined without problems also: 2<3,5>1,4<6<br/>This shouldn't be underlined</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:20.020"
+ end="00:00:20.500"><span region="Default">and also<br/>hide invalid html tags with parameters that are closed and show the text in them<br/>but show un-closed invalid html tags<br/>This text should be showed underlined without problems also: 2<3,5>1,4<6<br/>This shouldn't be underlined</span></p>
+ <p
+ begin="00:00:20.501"
+ end="00:00:21.500"><span region="Default">This text should be in the normal position...</span></p>
+ <p
+ begin="00:00:21.501"
+ end="00:00:22.022"><span region="Default">This text should NOT be in the normal position</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:22.022"
+ end="00:00:22.500"><span region="Default">This text should NOT be in the normal position</span></p>
+ <p
+ begin="00:00:22.501"
+ end="00:00:24.024"><span region="Default">Implementation is the same of the ASS tag<br/>This text should be at the<br/>top and horizontally centered</span></p>
+ <p
+ begin="00:00:22.502"
+ end="00:00:24.024"><span region="Default">This text should be at the<br/>middle and horizontally centered</span></p>
+ <p
+ begin="00:00:22.503"
+ end="00:00:24.024"><span region="Default">This text should be at the<br/>bottom and horizontally centered</span></p>
+ </div>
+ </body>
+</tt>
+<?xml version="1.0" encoding="utf-8"?>
+<tt
+ xmlns="http://www.w3.org/ns/ttml"
+ xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
+ xmlns:tts="http://www.w3.org/ns/ttml#styling"
+ xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
+ ttp:cellResolution="384 288"
+ xml:lang="">
+ <head>
+ <layout>
+ <region xml:id="Default"
+ tts:origin="3% 0%"
+ tts:extent="97% 97%"
+ tts:displayAlign="after"
+ tts:textAlign="center"
+ tts:fontSize="16c"
+ tts:fontFamily="Arial"
+ tts:overflow="visible" />
+ </layout>
+ </head>
+ <body>
+ <div>
+ <p
+ begin="00:00:24.024"
+ end="00:00:24.500"><span region="Default">Implementation is the same of the ASS tag<br/>This text should be at the<br/>top and horizontally centered</span></p>
+ <p
+ begin="00:00:24.024"
+ end="00:00:24.501"><span region="Default">This text should be at the<br/>middle and horizontally centered</span></p>
+ <p
+ begin="00:00:24.024"
+ end="00:00:24.502"><span region="Default">This text should be at the<br/>bottom and horizontally centered</span></p>
+ <p
+ begin="00:00:24.501"
+ end="00:00:24.525"><span region="Default">This text should be at the<br/>top and horizontally at the left</span></p>
+ <p
+ begin="00:00:24.502"
+ end="00:00:24.525"><span region="Default">This text should be at the<br/>middle and horizontally at the left<br/>(The second position must be ignored)</span></p>
+ <p
+ begin="00:00:24.503"
+ end="00:00:24.525"><span region="Default">This text should be at the<br/>bottom and horizontally at the left</span></p>
+ </div>
+ </body>
+</tt>
+packet,subtitle,1,0,0.000000,0,0.000000,N/A,N/A,1172,14302,K__,CRC32:bde7afa1
+packet,subtitle,1,2002,2.002000,2002,2.002000,N/A,N/A,1015,28648,K__,CRC32:bd3bd4bc
+packet,subtitle,1,4004,4.004000,4004,4.004000,N/A,N/A,1305,42837,K__,CRC32:c8ff5017
+packet,subtitle,1,6006,6.006000,6006,6.006000,N/A,N/A,1111,57316,K__,CRC32:f0b10da6
+packet,subtitle,1,8008,8.008000,8008,8.008000,N/A,N/A,927,71601,K__,CRC32:55a7bb1b
+packet,subtitle,1,10010,10.010000,10010,10.010000,N/A,N/A,1194,85702,K__,CRC32:03dc4753
+packet,subtitle,1,12012,12.012000,12012,12.012000,N/A,N/A,874,100070,K__,CRC32:c7a092d4
+packet,subtitle,1,14014,14.014000,14014,14.014000,N/A,N/A,1154,114118,K__,CRC32:b476fe9c
+packet,subtitle,1,16016,16.016000,16016,16.016000,N/A,N/A,1240,128446,K__,CRC32:912e694c
+packet,subtitle,1,18018,18.018000,18018,18.018000,N/A,N/A,960,142860,K__,CRC32:bba73912
+packet,subtitle,1,20020,20.020000,20020,20.020000,N/A,N/A,1251,156994,K__,CRC32:4c7b87d8
+packet,subtitle,1,22022,22.022000,22022,22.022000,N/A,N/A,1285,171419,K__,CRC32:c0368927
+packet,subtitle,1,24024,24.024000,24024,24.024000,N/A,N/A,1676,181630,K__,CRC32:812a103f