Commit 77eeaa2c authored by Clément Bœsch's avatar Clément Bœsch

lavf/srtdec: rewrite parsing logic

Fixes Ticket #5032

The samples in Ticket #5032 is using \r\r\n as line breaks.  Since we
already are handling \r, or \n, or \r\n as line breaks, \r\n\n will be
considered as a double line breaks. This is an issue because
ff_subtitles_read_text_chunk() will as a result stop extracting a chunk
after just one line.

So instead of parsing the SRT by "chunks" (which means splitting every
double LB), this new parser is detecting timing lines, and split the
events on this basis. While this sounds safe and simple, it needs to
take into account the event number preceding the timing line while
handling situations such as:

 - event number starting at 0 or actually any number instead of 1
 - event numbers not being ordered at all
 - event number being followed by text garbage (this really happened,
   see Ticket #4898)
 - event payload containing one or multiple number (a protagonist saying
   a count-down, a date or whatever) which could be confused with a
   chapter number
 - event number being empty (see Ticket #2167)
 - all kind of weird line breaks can appear randomly like wild pokémons
 - untrustable line breaks (Ticket #5032)

The sample madness.srt tries to sum up most of this into one sample,
ticket5032-rrn.srt is the file containing \r\r\n line breaks. and
empty-events-2167.srt contains empty events.
parent 5236cf87
/*
* SubRip subtitle demuxer
* Copyright (c) 2010 Aurelien Jacobs <aurel@gnuage.org>
* Copyright (c) 2015 Clément Bœsch <u pkh me>
*
* This file is part of FFmpeg.
*
......@@ -58,28 +59,65 @@ static int srt_probe(AVProbeData *p)
return 0;
}
static int64_t get_pts(const char **buf, int *duration,
int32_t *x1, int32_t *y1, int32_t *x2, int32_t *y2)
struct event_info {
int32_t x1, x2, y1, y2;
int duration;
int64_t pts;
int64_t pos;
};
static int get_event_info(const char *line, struct event_info *ei)
{
int hh1, mm1, ss1, ms1;
int hh2, mm2, ss2, ms2;
ei->x1 = ei->x2 = ei->y1 = ei->y2 = ei->duration = -1;
ei->pts = AV_NOPTS_VALUE;
ei->pos = -1;
if (sscanf(line, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d"
"%*[ ]X1:%u X2:%u Y1:%u Y2:%u",
&hh1, &mm1, &ss1, &ms1,
&hh2, &mm2, &ss2, &ms2,
&ei->x1, &ei->x2, &ei->y1, &ei->y2) >= 8) {
const int64_t start = (hh1*3600LL + mm1*60LL + ss1) * 1000LL + ms1;
const int64_t end = (hh2*3600LL + mm2*60LL + ss2) * 1000LL + ms2;
ei->duration = end - start;
ei->pts = start;
return 0;
}
return -1;
}
static int add_event(FFDemuxSubtitlesQueue *q, AVBPrint *buf, char *line_cache,
const struct event_info *ei, int append_cache)
{
int i;
for (i=0; i<2; i++) {
int hh1, mm1, ss1, ms1;
int hh2, mm2, ss2, ms2;
if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d"
"%*[ ]X1:%u X2:%u Y1:%u Y2:%u",
&hh1, &mm1, &ss1, &ms1,
&hh2, &mm2, &ss2, &ms2,
x1, x2, y1, y2) >= 8) {
int64_t start = (hh1*3600LL + mm1*60LL + ss1) * 1000LL + ms1;
int64_t end = (hh2*3600LL + mm2*60LL + ss2) * 1000LL + ms2;
*duration = end - start;
*buf += ff_subtitles_next_line(*buf);
return start;
if (append_cache && line_cache[0])
av_bprintf(buf, "%s\n", line_cache);
line_cache[0] = 0;
while (buf->len > 0 && buf->str[buf->len - 1] == '\n')
buf->str[--buf->len] = 0;
if (buf->len) {
AVPacket *sub = ff_subtitles_queue_insert(q, buf->str, buf->len, 0);
if (!sub)
return AVERROR(ENOMEM);
av_bprint_clear(buf);
sub->pos = ei->pos;
sub->pts = ei->pts;
sub->duration = ei->duration;
if (ei->x1 != -1) {
uint8_t *p = av_packet_new_side_data(sub, AV_PKT_DATA_SUBTITLE_POSITION, 16);
if (p) {
AV_WL32(p, ei->x1);
AV_WL32(p + 4, ei->y1);
AV_WL32(p + 8, ei->x2);
AV_WL32(p + 12, ei->y2);
}
}
*buf += ff_subtitles_next_line(*buf);
}
return AV_NOPTS_VALUE;
return 0;
}
static int srt_read_header(AVFormatContext *s)
......@@ -88,6 +126,9 @@ static int srt_read_header(AVFormatContext *s)
AVBPrint buf;
AVStream *st = avformat_new_stream(s, NULL);
int res = 0;
char line[4096], line_cache[4096];
int has_event_info = 0;
struct event_info ei;
FFTextReader tr;
ff_text_init_avio(s, &tr, s->pb);
......@@ -99,43 +140,67 @@ static int srt_read_header(AVFormatContext *s)
av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
line_cache[0] = 0;
while (!ff_text_eof(&tr)) {
ff_subtitles_read_text_chunk(&tr, &buf);
if (buf.len) {
int64_t pos = ff_text_pos(&tr);
int64_t pts;
int duration;
const char *ptr = buf.str;
int32_t x1 = -1, y1 = -1, x2 = -1, y2 = -1;
AVPacket *sub;
pts = get_pts(&ptr, &duration, &x1, &y1, &x2, &y2);
if (pts != AV_NOPTS_VALUE) {
int len = buf.len - (ptr - buf.str);
if (len <= 0)
continue;
sub = ff_subtitles_queue_insert(&srt->q, ptr, len, 0);
if (!sub) {
res = AVERROR(ENOMEM);
struct event_info tmp_ei;
const int64_t pos = ff_text_pos(&tr);
ptrdiff_t len = ff_subtitles_read_line(&tr, line, sizeof(line));
if (len < 0)
break;
if (!len || !line[0])
continue;
if (get_event_info(line, &tmp_ei) < 0) {
char *pline;
if (!has_event_info)
continue;
if (line_cache[0]) {
/* We got some cache and a new line so we assume the cached
* line was actually part of the payload */
av_bprintf(&buf, "%s\n", line_cache);
line_cache[0] = 0;
}
/* If the line doesn't start with a number, we assume it's part of
* the payload, otherwise is likely an event number preceding the
* timing information... but we can't be sure of this yet, so we
* cache it */
if (strtol(line, &pline, 10) < 0 || line == pline)
av_bprintf(&buf, "%s\n", line);
else
strcpy(line_cache, line);
} else {
if (has_event_info) {
/* We have the information of previous event, append it to the
* queue. We insert the cached line if and only if the payload
* is empty and the cached line is not a standalone number. */
char *pline = NULL;
const int standalone_number = strtol(line_cache, &pline, 10) >= 0 && pline && !*pline;
res = add_event(&srt->q, &buf, line_cache, &ei, !buf.len && !standalone_number);
if (res < 0)
goto end;
}
sub->pos = pos;
sub->pts = pts;
sub->duration = duration;
if (x1 != -1) {
uint8_t *p = av_packet_new_side_data(sub, AV_PKT_DATA_SUBTITLE_POSITION, 16);
if (p) {
AV_WL32(p, x1);
AV_WL32(p + 4, y1);
AV_WL32(p + 8, x2);
AV_WL32(p + 12, y2);
}
}
} else {
has_event_info = 1;
}
tmp_ei.pos = pos;
ei = tmp_ei;
}
}
/* Append the last event. Here we force the cache to be flushed, because a
* trailing number is more likely to be geniune (for example a copyright
* date) and not the event index of an inexistant event */
if (has_event_info) {
res = add_event(&srt->q, &buf, line_cache, &ei, 1);
if (res < 0)
goto end;
}
ff_subtitles_queue_finalize(s, &srt->q);
end:
......
......@@ -52,6 +52,15 @@ fate-sub-sami2: CMD = fmtstdout ass -i $(TARGET_SAMPLES)/sub/SAMI_multilang_twea
FATE_SUBTITLES_ASS-$(call DEMDEC, SRT, SUBRIP) += fate-sub-srt
fate-sub-srt: CMD = fmtstdout ass -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER SRT_MUXER) += fate-sub-srt-rrn-remux
fate-sub-srt-rrn-remux: CMD = fmtstdout srt -i $(TARGET_SAMPLES)/sub/ticket5032-rrn.srt -c:s copy
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER SRT_MUXER) += fate-sub-srt-madness-timeshift
fate-sub-srt-madness-timeshift: CMD = fmtstdout srt -itsoffset 3.14 -i $(TARGET_SAMPLES)/sub/madness.srt -c:s copy
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER SRT_MUXER) += fate-sub-srt-empty-events
fate-sub-srt-empty-events: CMD = fmtstdout srt -i $(TARGET_SAMPLES)/sub/empty-events-2167.srt -c:s copy
FATE_SUBTITLES_ASS-$(call DEMDEC, STL, STL) += fate-sub-stl
fate-sub-stl: CMD = fmtstdout ass -i $(TARGET_SAMPLES)/sub/STL_capability_tester.stl
......
1
00:00:51,940 --> 00:00:53,320
我们期待一些事
2
00:00:53,340 --> 00:00:56,020
比从前更好的事
3
00:00:56,140 --> 00:00:58,920
我们期待的更多
4
00:00:59,540 --> 00:01:02,020
你真以为藏到壁画后面
5
02:09:09,350 --> 02:09:10,850
就失去你
6
02:11:34,350 --> 02:11:37,850
(怀念我们的朋友“面具”小查尔斯·刘易斯)
1
00:00:04,251 --> 00:00:05,362
okay, let's make things easy
2
00:00:05,160 --> 00:00:05,263
31 i'm a number but the only payload so please keep me :)
3
00:00:06,473 --> 00:00:07,584
hello
5
don't forget me.
4
00:00:08,695 --> 00:00:09,806
no.
let's add some fun
5
00:00:10,917 --> 00:00:12,028
let's do it in reverse bc wtf not
45 yes this is a number but i'm actually part of the sub
6
00:00:12,028 --> 00:00:13,139
1
0
next is negative, not a chapnum ;)
-1
7
00:00:13,241 --> 00:00:13,263
credits
2015
1
00:00:01,000 --> 00:00:04,074
Subtitles downloaded from Podnapisi.NET
2
00:00:17,317 --> 00:00:19,551
Wooldoor: who's it gonna
be?! Who's it gonna be?!
3
00:00:19,552 --> 00:00:21,053
Wheeeeee!
4
00:00:21,054 --> 00:00:23,122
Wooldoor:
the producers decided
to surprise one of us
5
00:00:23,123 --> 00:00:24,990
With a visit from
a family member.
6
00:00:24,991 --> 00:00:26,191
I hope it's someone
from my family
7
00:00:26,192 --> 00:00:27,493
Like flagfred cheesewheel,
8
00:00:27,494 --> 00:00:30,262
Lintsue brickshade,
or prom-queen dumpsterbaby.
9
00:00:30,263 --> 00:00:32,197
[speaking japanese]
10
00:00:38,905 --> 00:00:41,407
Look, everyone!
Someone's coming!
11
00:00:41,408 --> 00:00:43,575
Clara: the second I saw
the horse and carriage,
12
00:00:43,576 --> 00:00:47,079
I just knew it had
to be someone from
my kingdom.
13
00:00:47,080 --> 00:00:50,683
But when I saw it was
the short carriage,
my heart sank.
14
00:00:50,684 --> 00:00:53,786
Why?! Why did she
have to come?!
15
00:00:55,221 --> 00:00:56,588
Oh, fuck me.
16
00:00:56,589 --> 00:00:58,223
[garbled speech]
17
00:00:58,224 --> 00:01:03,362
Um, everyone, this is
my special cousin bleh.
18
00:01:03,363 --> 00:01:04,530
Foxxy: no one knew clara
19
00:01:04,531 --> 00:01:07,132
Had a mentally-challenged
cousin, but it was cool.
20
00:01:07,133 --> 00:01:10,269
The foxxy five used to perform
for special needs kids,
21
00:01:10,270 --> 00:01:14,306
And those people got
hearts as big as they
oversized foreheads.
22
00:01:14,307 --> 00:01:18,610
<i>"I am sam is a well-written
and exceptionally well-acted
tearjerker,"</i>
23
00:01:18,611 --> 00:01:21,213
<i>Raves adam nayman
of eye weekly.</i>
24
00:01:23,149 --> 00:01:25,250
What the shoebazzle
was that?
25
00:01:25,251 --> 00:01:29,755
<i>She, um, only
quotes reviews from
the movie I am sam.</i>
26
00:01:29,756 --> 00:01:31,690
Huh?
Hmm.
27
00:01:31,691 --> 00:01:33,525
Well, this has
been fun. Bye!
28
00:01:35,195 --> 00:01:38,397
Well, i've never seen
someone that slow
go that fast.
29
00:01:38,398 --> 00:01:40,132
Oh, yeah! Give it up!
30
00:01:40,133 --> 00:01:41,066
Yeah!
31
00:01:45,705 --> 00:01:47,639
[speaking japanese]
32
00:01:55,215 --> 00:01:59,952
Oh, poor ling-ling.
He's so disappointed
his father didn't show.
33
00:01:59,953 --> 00:02:01,387
Oh!
34
00:02:01,388 --> 00:02:04,590
Oh, sweetie,
i'm so sorry your
father's not coming.
35
00:02:04,591 --> 00:02:08,127
We still love ya!
Don't we, toot?!
36
00:02:08,128 --> 00:02:10,963
Fine!
37
00:02:10,964 --> 00:02:12,197
[kiss]
38
00:02:12,198 --> 00:02:16,035
Ling-ling,
you taste so weird.
39
00:02:17,470 --> 00:02:19,204
[giggling]
40
00:02:19,205 --> 00:02:21,140
[giggling]
41
00:02:22,208 --> 00:02:25,177
Let's go, bleh.
The coast is clear.
42
00:02:25,178 --> 00:02:27,746
But after this,
no more potty breaks.
43
00:02:27,747 --> 00:02:30,082
<i>"I am sam plays like
a made-for-tv weep--"</i>
44
00:02:30,083 --> 00:02:31,316
Shh!
45
00:02:31,317 --> 00:02:33,786
I know it seemed
like I was ashamed
of my cousin,
46
00:02:33,787 --> 00:02:35,921
But nothing could be
further from the truth.
47
00:02:35,922 --> 00:02:39,591
Aah!
Foxxy:
hey, clara!
48
00:02:39,592 --> 00:02:41,060
What's up, girlfriend?
49
00:02:41,061 --> 00:02:43,062
You know,
none of us have
really had a chance
50
00:02:43,063 --> 00:02:44,763
To hang out
with bleh yet.
51
00:02:44,764 --> 00:02:47,232
Bleh? What's a bleh?
52
00:02:47,233 --> 00:02:49,835
Is that one of your
jive words like
"emancipation"?
53
00:02:49,836 --> 00:02:51,603
No, bleh your cousin.
54
00:02:51,604 --> 00:02:55,808
Uh, clara?
Why is the lamp drooling?
55
00:02:55,809 --> 00:02:59,044
I guess to remind us
to conserve electricity.
56
00:02:59,045 --> 00:03:03,248
Clara, there is
no reason to be
embarrassed by your cousin.
57
00:03:03,249 --> 00:03:06,085
Embarrassed?
I'm not embarrassed.
58
00:03:06,086 --> 00:03:09,321
Stop pretending
bleh is a lamp.
59
00:03:09,322 --> 00:03:11,824
She is not a lamp,
clara.
60
00:03:11,825 --> 00:03:15,160
She is a real person
with real feelings.
61
00:03:15,161 --> 00:03:17,096
Foxxy was probably right.
62
00:03:17,097 --> 00:03:18,864
Damn that ms. Know-it-all!
63
00:03:18,865 --> 00:03:21,400
I should have killed her
when I had the chance.
64
00:03:21,401 --> 00:03:22,835
Give me your hand!
65
00:03:22,836 --> 00:03:24,603
First, give me the ring!
66
00:03:24,604 --> 00:03:27,206
[kisses]
67
00:03:27,207 --> 00:03:29,208
Xandir:
it just didn't make sense.
68
00:03:29,209 --> 00:03:30,709
When we licked ling-ling
last time,
69
00:03:30,710 --> 00:03:31,877
We got all [bleep]ed up.
70
00:03:31,878 --> 00:03:33,479
But this time, nothing happened.
71
00:03:33,480 --> 00:03:35,047
Well, we got a little aroused,
72
00:03:35,048 --> 00:03:36,982
But not [bleep]ed up.
73
00:03:36,983 --> 00:03:38,517
Uhh! What's the deal-e-o?
74
00:03:38,518 --> 00:03:40,085
I don't feel
anything. You?
75
00:03:40,086 --> 00:03:41,086
Nothing.
76
00:03:41,087 --> 00:03:42,755
[kisses]
77
00:03:42,756 --> 00:03:45,858
Hmm. Maybe we have to
eat ling-ling.
78
00:03:45,859 --> 00:03:47,326
Why is it when
something doesn't work,
79
00:03:47,327 --> 00:03:49,228
Your first reaction
is to eat it?
80
00:03:49,229 --> 00:03:52,631
What?! What
are you doing?
81
00:03:52,632 --> 00:03:55,067
I couldn't find
the remote.
82
00:03:55,068 --> 00:03:56,735
You know,
there is one person
83
00:03:56,736 --> 00:03:58,203
Who can figure this out.
84
00:03:58,204 --> 00:03:59,705
The professor!
The professor!
85
00:03:59,706 --> 00:04:01,674
[hums]
86
00:04:01,675 --> 00:04:02,675
Ooh!
87
00:04:02,676 --> 00:04:03,876
Aha!
[whistle blows]
88
00:04:03,877 --> 00:04:05,577
Got it.
Hit the lights.
89
00:04:09,416 --> 00:04:11,717
Here you see
the african camel toad.
90
00:04:11,718 --> 00:04:13,118
It secretes
a hallucinogen
91
00:04:13,119 --> 00:04:14,153
Whenever it's scared.
92
00:04:14,154 --> 00:04:15,320
Ahh!
93
00:04:15,321 --> 00:04:17,423
Yeah, that's--oh,
I didn't know that.
94
00:04:17,424 --> 00:04:21,360
When "cool" kids feel
like catching a "buzz,"
95
00:04:21,361 --> 00:04:25,064
They scare the amphibian
and then lick its skin.
96
00:04:25,065 --> 00:04:27,166
All the cool kids,
you say?
97
00:04:27,167 --> 00:04:31,036
Now take ling-ling,
the asian trading card
battle monster.
98
00:04:31,037 --> 00:04:32,638
It creates a similar
hallucinogen
99
00:04:32,639 --> 00:04:34,807
Whenever it's
disappointed.
100
00:04:34,808 --> 00:04:37,443
Ahh!
Oh, I want to
be cool!
101
00:04:37,444 --> 00:04:40,946
So, ling-ling
was experiencing
disappointment
102
00:04:40,947 --> 00:04:42,614
Due to its
father's absence,
103
00:04:42,615 --> 00:04:44,183
Then, upon kissing
ling-ling,
104
00:04:44,184 --> 00:04:47,186
You became...[wacky
noises] technically
speaking.
105
00:04:47,187 --> 00:04:53,692
So, only when ling-ling
is disappointed, eh? Hmm.
106
00:04:55,662 --> 00:04:59,932
[screaming]
[alarm]
[siren]
107
00:04:59,933 --> 00:05:02,067
[bagpipes playing]
108
00:05:02,068 --> 00:05:03,635
[harps playing]
109
00:05:03,636 --> 00:05:05,938
[crickets chirping]
110
00:05:05,939 --> 00:05:09,942
Oh! Don't look,
but corky at 3:00.
111
00:05:09,943 --> 00:05:13,045
Foxxy: it looked like I got
through to the princess.
112
00:05:13,046 --> 00:05:15,881
Clara would see that
there ain't no reason
to be ashamed of bleh.
113
00:05:15,882 --> 00:05:17,316
We all adults.
114
00:05:17,317 --> 00:05:19,985
Dude, let's egg
the trainable.
115
00:05:19,986 --> 00:05:21,854
Mind if we
join you guys?
116
00:05:21,855 --> 00:05:24,189
No, no, no.
Of course not.
117
00:05:24,190 --> 00:05:25,891
Don't be stupid.
118
00:05:25,892 --> 00:05:28,027
[both snicker]
119
00:05:43,176 --> 00:05:44,543
[eggshells crack]
120
00:05:48,915 --> 00:05:52,217
Man, clara's cousin
is so hot!
121
00:05:52,218 --> 00:05:55,454
<i>Damn! She's like
retarded hot!</i>
122
00:06:01,127 --> 00:06:03,595
[whimpers] sam! Aah!
123
00:06:05,432 --> 00:06:06,365
Clara: i'm really glad
I brought bleh
124
00:06:06,366 --> 00:06:08,367
Down to hang out
with everyone.
125
00:06:08,368 --> 00:06:10,803
They treated her
like she was one
of the gang.
126
00:06:10,804 --> 00:06:12,771
I hadn't seen bleh
have this much fun
127
00:06:12,772 --> 00:06:15,207
<i>Since they cancelled
the pretty, shiny
object show.</i>
128
00:06:15,208 --> 00:06:18,210
You sure you don't
want to stay and
play a few rounds?
129
00:06:18,211 --> 00:06:21,280
Nah, it's getting late,
and we don't want to
intrude on guy time.
130
00:06:21,281 --> 00:06:22,648
'night!
131
00:06:22,649 --> 00:06:25,751
<i>"I am sam works magic
'cause of penn,"</i>
132
00:06:25,752 --> 00:06:28,153
<i>Raves lou lumenick
of the new york post.</i>
133
00:06:28,154 --> 00:06:30,022
I go first.
Whee!
134
00:06:30,023 --> 00:06:32,291
Holy shit!
135
00:06:32,292 --> 00:06:34,293
She is so hot!
136
00:06:34,294 --> 00:06:36,161
Oh, spanky.
137
00:06:36,162 --> 00:06:38,564
What? Oh. Ok.
138
00:06:38,565 --> 00:06:39,498
[kiss]
139
00:06:40,700 --> 00:06:42,568
Oh, that bleh, man.
140
00:06:42,569 --> 00:06:45,037
I would totally dip
my wick in that.
141
00:06:45,038 --> 00:06:47,906
Listen, dude. No matter
how hot she is,
142
00:06:47,907 --> 00:06:50,009
You would not
punch holes in a sped.
143
00:06:50,010 --> 00:06:51,210
Oh, hell,
yeah, I would.
144
00:06:51,211 --> 00:06:52,544
I mean, she's
the perfect girl.
145
00:06:52,545 --> 00:06:54,480
All the sweater meat
of a regular chick
146
00:06:54,481 --> 00:06:56,181
And half
the pillow talk.
147
00:06:58,385 --> 00:06:59,752
[kiss]
148
00:06:59,753 --> 00:07:01,987
Man, you're all talk.
149
00:07:01,988 --> 00:07:04,757
Look, I got 20 large
that says you won't
sleep with her.
150
00:07:04,758 --> 00:07:07,659
Make it 50
and you're on.
151
00:07:07,660 --> 00:07:10,262
Oh, ha ha!
Wheeeeeee!
152
00:07:10,263 --> 00:07:13,198
Hey, if you're gonna
be gay about this,
you can't play.
153
00:07:13,199 --> 00:07:14,333
Sorry.
154
00:07:15,402 --> 00:07:16,635
[kiss]
155
00:07:16,636 --> 00:07:20,205
Fine. 50 bucks says you
won't have sex with bleh.
156
00:07:20,206 --> 00:07:22,207
Easy money.
157
00:07:22,208 --> 00:07:24,076
Captain hero is
gonna show you guys
158
00:07:24,077 --> 00:07:26,679
What being a real man
is all about.
159
00:07:26,680 --> 00:07:28,681
All: triple kiss!
160
00:07:28,682 --> 00:07:30,516
[kisses]
161
00:07:37,657 --> 00:07:41,293
[snarls]
162
00:07:41,294 --> 00:07:43,228
[speaking japanese]
163
00:07:48,601 --> 00:07:52,571
¶ ling-ling
into battle go ¶
164
00:07:52,572 --> 00:07:55,140
¶ fulfill destiny
of the soul ¶
165
00:07:55,141 --> 00:07:56,542
¶ all the children sing ¶
166
00:07:56,543 --> 00:08:00,045
Kids: ¶ kill,
kill, kill, kill,
die, die, die ¶
167
00:08:00,046 --> 00:08:01,580
¶ kill, kill,
kill, kill... ¶
168
00:08:01,581 --> 00:08:04,583
Wait, ling-ling.
It's just us.
169
00:08:04,584 --> 00:08:08,087
We're not really
a 3-headed, acid-spitting
needle monster.
170
00:08:08,088 --> 00:08:11,190
[speaking japanese]
171
00:08:11,191 --> 00:08:12,825
Oh.
172
00:08:12,826 --> 00:08:14,960
Oh, no, ling-ling.
173
00:08:14,961 --> 00:08:16,228
Instead of
cheering you up,
174
00:08:16,229 --> 00:08:21,367
We accidentally
disappointed you.
175
00:08:21,368 --> 00:08:24,069
Oh, poor baby.
176
00:08:24,070 --> 00:08:25,471
Triple kiss!
177
00:08:25,472 --> 00:08:27,373
Oh! Hee hee!
[kisses]
178
00:08:27,374 --> 00:08:31,310
[sighing and giggling]
179
00:08:38,184 --> 00:08:39,585
[knocks]
180
00:08:39,586 --> 00:08:41,420
Clara:
I found it a bit odd
181
00:08:41,421 --> 00:08:44,023
That captain hero
wanted to take bleh
out on a date,
182
00:08:44,024 --> 00:08:45,691
And it was
my responsibility
183
00:08:45,692 --> 00:08:48,127
To make sure his
intentions were pure.
184
00:08:48,128 --> 00:08:50,329
So, captain hero, is it?
185
00:08:50,330 --> 00:08:52,464
Oh. Heh heh! Yeah?
186
00:08:52,465 --> 00:08:53,966
Coming to take
my little bleh out
187
00:08:53,967 --> 00:08:55,634
For a night
on the town, eh?
188
00:08:55,635 --> 00:08:57,770
You know, I don't
know what'd I do
189
00:08:57,771 --> 00:08:59,805
If anything happened
to my little bleh.
190
00:08:59,806 --> 00:09:02,341
Yes, ma'am.
I mean, no, ma'am.
191
00:09:02,342 --> 00:09:04,943
Son, do you know
what it's like
192
00:09:04,944 --> 00:09:08,147
To kill a man with
your bare hands?
193
00:09:08,148 --> 00:09:09,748
I do.
194
00:09:09,749 --> 00:09:10,883
I...
195
00:09:10,884 --> 00:09:12,151
Oh!
196
00:09:12,152 --> 00:09:13,986
Here's bleh now!
197
00:09:13,987 --> 00:09:16,155
¶ there she is... ¶
198
00:09:16,156 --> 00:09:19,825
Wow! You look...
Stunning.
199
00:09:19,826 --> 00:09:25,497
<i>"I am sam's dakota
fanning is worth the
price of admission."</i>
200
00:09:25,498 --> 00:09:27,700
[blow dart]
201
00:09:27,701 --> 00:09:29,501
Ow! What the hell?!
202
00:09:29,502 --> 00:09:31,904
A little
added protection.
203
00:09:31,905 --> 00:09:34,807
You'll get the antidote
when I get my bleh back.
204
00:09:34,808 --> 00:09:39,311
[all giggling]
205
00:09:39,312 --> 00:09:42,748
Hey, ling-ling,
you excited for
christmas?
206
00:09:42,749 --> 00:09:45,317
Too bad there's
no such thing
as santa claus!
207
00:09:45,318 --> 00:09:46,985
I bet you're
disappointed.
208
00:09:46,986 --> 00:09:48,153
Oh.
209
00:09:48,154 --> 00:09:50,889
[laughs]
210
00:09:50,890 --> 00:09:53,659
Hey, look what
I found in your ear!
211
00:09:53,660 --> 00:09:55,427
Is it a quarter?
212
00:09:55,428 --> 00:09:58,330
Oh, no!
It's a tumor!
213
00:09:58,331 --> 00:09:59,765
Oh.
214
00:09:59,766 --> 00:10:02,601
[slurps]
215
00:10:02,602 --> 00:10:04,370
[giggles]
216
00:10:04,371 --> 00:10:09,008
Hey, ling-ling,
you excited for
christmas?
217
00:10:09,009 --> 00:10:11,443
Oh, no!
It's a tumor!
218
00:10:11,444 --> 00:10:12,845
Oh.
219
00:10:12,846 --> 00:10:16,181
[slurps]
220
00:10:16,182 --> 00:10:19,418
¶ girly, girly,
girly, girly... ¶
221
00:10:19,419 --> 00:10:23,689
[bleh shouts happily
and incoherently]
222
00:10:23,690 --> 00:10:25,357
Captain hero:
yes, I was confident
223
00:10:25,358 --> 00:10:28,327
That by the end of the
night, i'd have another
notch on my utility belt
224
00:10:28,328 --> 00:10:30,095
And 50 bucks in my pocket.
225
00:10:30,096 --> 00:10:33,565
Then I realized
something. Bleh...
226
00:10:33,566 --> 00:10:35,034
She was really special,
227
00:10:35,035 --> 00:10:36,635
But not like in
a retarded way,
228
00:10:36,636 --> 00:10:39,004
In a traditionally
special way.
229
00:10:39,005 --> 00:10:44,943
¶ did you ever know
that you're my hero? ¶
230
00:10:44,944 --> 00:10:46,245
Oh!
231
00:10:46,246 --> 00:10:47,546
Ok!
232
00:10:47,547 --> 00:10:53,352
¶ you're everything
I wish I could be ¶
233
00:10:53,353 --> 00:10:56,088
¶ I could fly higher
than an eagle ¶
234
00:10:56,089 --> 00:10:57,556
[both giggle]
235
00:10:57,557 --> 00:10:59,558
Sam.
236
00:10:59,559 --> 00:11:02,761
I don't like
these things.
They scare me!
237
00:11:02,762 --> 00:11:05,631
¶ beneath my wings ¶
238
00:11:05,632 --> 00:11:09,468
Eeeeeeh! Aah! Sam!
¶ oh, oh, fly ¶
239
00:11:09,469 --> 00:11:14,340
¶ so high
against the sky ¶
240
00:11:14,341 --> 00:11:16,942
¶ so high I almost... ¶
241
00:11:16,943 --> 00:11:20,646
Bleh, you are the wind
beneath my wings.
242
00:11:20,647 --> 00:11:22,681
"contrived, manipulative,
243
00:11:22,682 --> 00:11:28,721
<i>And shamelessly
sentimental," raves peter
travers from rolling stone.</i>
244
00:11:34,627 --> 00:11:37,596
Hey, ling-ling,
I got a penny.
No, I don't.
245
00:11:37,597 --> 00:11:39,198
[licks dry fur]
246
00:11:39,199 --> 00:11:40,866
[rattles]
247
00:11:40,867 --> 00:11:41,867
[bam bam]
248
00:11:41,868 --> 00:11:43,702
[licks dry fur]
249
00:11:43,703 --> 00:11:46,138
Whoa, guys. Guys!
250
00:11:46,139 --> 00:11:47,840
Ling-ling is
totally kicked!
251
00:11:47,841 --> 00:11:48,841
What?!
252
00:11:48,842 --> 00:11:50,209
[pants]
253
00:11:50,210 --> 00:11:52,978
[licks dry fur]
254
00:11:52,979 --> 00:11:54,747
Don't hold out
on me, man.
255
00:11:54,748 --> 00:11:57,449
I need my fix.
Come on! Please,
man, come on!
256
00:11:57,450 --> 00:11:59,618
What do you want?
I'll do anything!
257
00:11:59,619 --> 00:12:01,253
I'll suck your dick!
258
00:12:03,156 --> 00:12:04,556
Ooh! Ooh, sam!
259
00:12:04,557 --> 00:12:05,991
Hee hee!
Shh!
260
00:12:05,992 --> 00:12:08,861
Are you crazy?
They'll hear us!
261
00:12:08,862 --> 00:12:11,764
Captain hero:
bleh and I got home way
past midnight.
262
00:12:11,765 --> 00:12:15,701
I was like, we are gonna
get in so much trouble!
263
00:12:15,702 --> 00:12:19,672
So, this was
really fantastic.
264
00:12:19,673 --> 00:12:23,842
Um, I,
uh...Good night.
265
00:12:23,843 --> 00:12:24,777
[kiss]
266
00:12:25,879 --> 00:12:27,513
¶ girly, girly,
girly, girly... ¶
267
00:12:27,514 --> 00:12:29,415
Ahh!
268
00:12:29,416 --> 00:12:32,951
Hey, super stud.
Did you sleep
with her?
269
00:12:32,952 --> 00:12:34,453
Dude, back off!
270
00:12:34,454 --> 00:12:36,922
I did not, as you
so crudely put it...
271
00:12:36,923 --> 00:12:38,857
"nail her
in the stink tube."
272
00:12:38,858 --> 00:12:40,592
It's not like that.
273
00:12:40,593 --> 00:12:42,961
So you kids are
taking it slow?
274
00:12:42,962 --> 00:12:43,996
See what I did
there? I--
275
00:12:43,997 --> 00:12:45,998
You just don't get it,
spanky.
276
00:12:45,999 --> 00:12:47,299
Nobody gets it!
277
00:12:47,300 --> 00:12:48,467
[wails]
278
00:12:48,468 --> 00:12:50,069
[door slams]
279
00:12:50,070 --> 00:12:51,470
Captain hero:
I was lying in bed,
280
00:12:51,471 --> 00:12:54,273
Replaying the date over
and over in my head,
281
00:12:54,274 --> 00:12:56,842
When there was a knock
at the door.
[knocks]
282
00:12:56,843 --> 00:12:57,776
Who's there?
283
00:12:58,845 --> 00:13:01,080
Bleh! What are you--
284
00:13:02,415 --> 00:13:04,983
Listen, bleh,
i'm not that kind of guy.
285
00:13:04,984 --> 00:13:05,984
[pulls pants down]
286
00:13:05,985 --> 00:13:08,153
Oh, my!
287
00:13:08,154 --> 00:13:12,057
Oh, no, no, no...
288
00:13:12,058 --> 00:13:14,293
Leave the helmet on.
289
00:13:17,330 --> 00:13:18,697
Ahh.
290
00:13:18,698 --> 00:13:21,433
Clara: that morning,
I woke up feeling great.
291
00:13:21,434 --> 00:13:24,269
Everyone had accepted
me and my cousin,
292
00:13:24,270 --> 00:13:25,971
And that was swell.
293
00:13:25,972 --> 00:13:29,875
Oh, what a glorious day,
isn't it, bleh?
294
00:13:29,876 --> 00:13:31,877
Bleh?
295
00:13:31,878 --> 00:13:33,612
Bleh?!
296
00:13:33,613 --> 00:13:37,683
Captain hero!
Clara, it's not
what you think!
297
00:13:37,684 --> 00:13:38,684
[gibberish]
298
00:13:38,685 --> 00:13:40,552
Get up! Get up
right now!
299
00:13:40,553 --> 00:13:43,856
<i>"I am sam reduces penn to
a mugging embarrassment,"</i>
300
00:13:43,857 --> 00:13:46,091
<i>Raves mike clark
of usa today.</i>
301
00:13:46,092 --> 00:13:47,860
I don't care.
Let's go!
302
00:13:47,861 --> 00:13:49,561
Yeeeh...
303
00:13:49,562 --> 00:13:52,297
Go back to your
cage right now!
304
00:13:52,298 --> 00:13:55,434
Spanky: well,
look who's doing
the limp of shame!
305
00:13:55,435 --> 00:13:57,169
You bastard!
306
00:13:57,170 --> 00:13:59,338
Captain hero:
clara totally overreacted.
307
00:13:59,339 --> 00:14:00,639
I mean, bleh was an adult,
308
00:14:00,640 --> 00:14:02,374
And completely capable
of making her own decisions.
309
00:14:02,375 --> 00:14:03,809
Or not.
310
00:14:03,810 --> 00:14:06,945
Still, I needed to
sit clara down and
explain what happened.
311
00:14:06,946 --> 00:14:09,948
Clara, I never expected
this to happen.
312
00:14:09,949 --> 00:14:14,720
It's just that I have
real feelings for her.
313
00:14:14,721 --> 00:14:17,389
Well...
314
00:14:17,390 --> 00:14:20,025
¶ there she is ¶
315
00:14:20,026 --> 00:14:23,295
¶ she's a girl ¶
316
00:14:23,296 --> 00:14:25,497
If that is the truth--
317
00:14:25,498 --> 00:14:26,932
It is.
318
00:14:26,933 --> 00:14:28,967
Then i'm truly happy
for the two of you.
319
00:14:28,968 --> 00:14:31,170
You're a good man,
captain hero.
320
00:14:31,171 --> 00:14:33,005
I knew I could
trust you.
321
00:14:33,006 --> 00:14:35,107
Here's the antidote.
322
00:14:35,108 --> 00:14:36,342
[gulp]
323
00:14:36,343 --> 00:14:38,977
Well, nice work,
captain hero.
324
00:14:38,978 --> 00:14:41,980
Here's the $50
I bet you to have
sex with bleh.
325
00:14:41,981 --> 00:14:42,981
[gasps]
326
00:14:42,982 --> 00:14:44,049
Yeeeeeh!
327
00:14:44,050 --> 00:14:45,184
Oh, um, I mean, uh...
328
00:14:45,185 --> 00:14:49,655
Here is the $50
captain hero won off me
329
00:14:49,656 --> 00:14:52,291
Because I bet him
he would not have sex
330
00:14:52,292 --> 00:14:53,926
With your
special cousin bleh.
331
00:14:53,927 --> 00:14:56,128
But he did, in fact,
have sex with her.
332
00:14:56,129 --> 00:14:58,564
Oh, yes, he did.
For $50.
333
00:14:58,565 --> 00:15:01,133
Oh, man. Saved it.
334
00:15:01,134 --> 00:15:07,539
Captain hero, I forbid you
to see my cousin ever again!
335
00:15:07,540 --> 00:15:08,774
Uhh!
336
00:15:08,775 --> 00:15:10,676
I would have been
more pissed at spanky,
337
00:15:10,677 --> 00:15:13,679
But you know,
I just won $50!
338
00:15:13,680 --> 00:15:16,382
[cash register bell]
ah! Who's your daddy?
339
00:15:16,383 --> 00:15:19,485
Ooh, I like the big one
and that one over there
340
00:15:19,486 --> 00:15:20,986
And...Ooh!
341
00:15:20,987 --> 00:15:25,057
Yeah. Hell, yeah!
[girls talking and laughing]
342
00:15:25,058 --> 00:15:26,925
Ehhhh.
343
00:15:26,926 --> 00:15:28,394
Ehhhh.
344
00:15:28,395 --> 00:15:30,362
Ehhhh.
345
00:15:30,363 --> 00:15:32,164
Oh, look at
poor ling-ling.
346
00:15:32,165 --> 00:15:33,932
We've licked
the life out of it.
347
00:15:33,933 --> 00:15:35,234
What should we do?
348
00:15:35,235 --> 00:15:36,235
Poke it harder.
349
00:15:36,236 --> 00:15:37,236
Uhh!
350
00:15:37,237 --> 00:15:38,237
[gasps]
351
00:15:38,238 --> 00:15:39,571
Look at me!
352
00:15:39,572 --> 00:15:42,608
I've become the very
thing I hate most.
353
00:15:42,609 --> 00:15:44,576
A guy who pokes things
with sticks?
354
00:15:44,577 --> 00:15:49,181
Oh, we've abused ling-ling
to the point where the
little guy is just numb.
355
00:15:49,182 --> 00:15:50,649
And for what?
356
00:15:50,650 --> 00:15:52,551
To catch a buzz?!
357
00:15:52,552 --> 00:15:55,654
I guess being cool
just isn't worth it.
358
00:15:55,655 --> 00:15:59,024
["what you already know"
jingle plays]
359
00:15:59,025 --> 00:16:01,293
Come on. We've got to
make this right!
360
00:16:02,529 --> 00:16:04,396
Sorry, wooldoor.
You stay here
361
00:16:04,397 --> 00:16:06,899
Until all that ling-ling
is out of your system.
362
00:16:06,900 --> 00:16:10,135
It's gonna be
the hardest thing
you've ever done.
363
00:16:10,136 --> 00:16:11,136
Toodles!
364
00:16:11,137 --> 00:16:13,405
[slam]
365
00:16:13,406 --> 00:16:15,474
Aah! I can't take it!
366
00:16:15,475 --> 00:16:18,477
[wacky noises]
367
00:16:21,047 --> 00:16:24,416
Ha ha ha ha ha ha!
Wooldoor: I can't take it!
368
00:16:24,417 --> 00:16:26,285
Aaaaaaaaaaaaaaaah!
369
00:16:26,286 --> 00:16:29,154
Captain hero:
oh, sure, the money
helped dull the pain,
370
00:16:29,155 --> 00:16:33,692
But later, you know, when
the stores are all closed,
371
00:16:33,693 --> 00:16:35,294
Who do I have
to share it with?
372
00:16:35,295 --> 00:16:41,433
Bleh? No. Not anymore.
Not anymore.
373
00:16:41,434 --> 00:16:43,635
It just wasn't
worth it, spanky!
374
00:16:43,636 --> 00:16:46,705
Bleh, she--
she was special.
375
00:16:46,706 --> 00:16:48,807
What are you--
what are you saying?
376
00:16:48,808 --> 00:16:52,678
Oh, spanky,
I love her.
377
00:16:53,880 --> 00:16:59,018
Then go to her.
378
00:16:59,019 --> 00:17:00,719
Xandir:
we knew what we had done
to ling-ling was wrong.
379
00:17:00,720 --> 00:17:02,488
Hopefully, this was gonna
380
00:17:02,489 --> 00:17:03,622
Make it up to that lovable,
381
00:17:03,623 --> 00:17:06,258
Fortune cookie cat thing.
382
00:17:06,259 --> 00:17:11,096
Ling-ling, there's
a special warrior
here to see you.
383
00:17:11,097 --> 00:17:15,567
[japanese song playing]
384
00:17:15,568 --> 00:17:17,503
[speaking japanese]
385
00:17:19,739 --> 00:17:21,674
[speaking japanese]
386
00:17:33,086 --> 00:17:35,654
Toot:
sure, we have our issues,
387
00:17:35,655 --> 00:17:39,224
But really, this is
a house drawn together
388
00:17:39,225 --> 00:17:40,659
With love.
389
00:17:40,660 --> 00:17:43,595
[speaking japanese]
390
00:18:05,752 --> 00:18:07,753
Yah!
Uhh!
391
00:18:07,754 --> 00:18:10,189
[slurping]
392
00:18:10,190 --> 00:18:12,991
All right, clara,
where is she?!
393
00:18:12,992 --> 00:18:15,828
Hah! You're too late,
captain jerko!
394
00:18:15,829 --> 00:18:18,630
She left for the front door
well over 2 minutes ago!
395
00:18:18,631 --> 00:18:21,066
You'll never catch her!
Never!
396
00:18:21,067 --> 00:18:23,202
Oh. Oh, well.
397
00:18:23,203 --> 00:18:24,903
I guess it wasn't
meant to be.
398
00:18:24,904 --> 00:18:26,939
Easy come, easy go.
399
00:18:26,940 --> 00:18:28,807
Well, i'll be
seeing you, clara.
400
00:18:28,808 --> 00:18:31,143
Wait! Damn you!
I've got to try!
401
00:18:31,144 --> 00:18:32,578
Yahh!
402
00:18:34,447 --> 00:18:36,448
Captain hero: bleh!
Wait! I'm coming!
403
00:18:36,449 --> 00:18:37,950
Dude, where are you--uhh!
404
00:18:37,951 --> 00:18:39,518
Watch it, pig!
405
00:18:39,519 --> 00:18:41,086
Go get her, man.
406
00:18:41,087 --> 00:18:42,087
Uhh!
407
00:18:42,088 --> 00:18:43,355
Watch it,
hot black girl!
408
00:18:43,356 --> 00:18:45,157
Go get her, man.
409
00:18:45,158 --> 00:18:49,895
[muzak playing]
410
00:18:49,896 --> 00:18:56,168
[blissful sighs and moans]
411
00:18:56,169 --> 00:18:57,770
Oh, come on!
412
00:19:00,206 --> 00:19:05,444
Bleh! Bleh!
Bleh! Bleh!
413
00:19:05,445 --> 00:19:06,812
Oh.
414
00:19:06,813 --> 00:19:08,747
Bleh! Bleh, wait!
415
00:19:08,748 --> 00:19:11,350
Listen, I don't know
what clara told you,
416
00:19:11,351 --> 00:19:14,453
But I love you.
417
00:19:14,454 --> 00:19:16,555
Yehhhhhhhh.
418
00:19:18,458 --> 00:19:20,192
[splat]
419
00:19:20,193 --> 00:19:22,127
"one of the year's
10 best!"
420
00:19:22,128 --> 00:19:25,631
"delivers in ways
you never expected!"
421
00:19:25,632 --> 00:19:29,134
Yes, well, maybe
it wouldn't work out.
422
00:19:29,135 --> 00:19:31,637
I mean, we come
from different worlds.
423
00:19:31,638 --> 00:19:33,772
I come from
planet zebulon
424
00:19:33,773 --> 00:19:36,909
And you come from
a mom who drank when
she was pregnant.
425
00:19:36,910 --> 00:19:40,446
Well, farewell,
my sweet.
426
00:19:40,447 --> 00:19:41,947
Mwah!
427
00:19:41,948 --> 00:19:44,983
Mnnnh deh
nnnh.
428
00:19:44,984 --> 00:19:47,186
Yeah! She kissed him!
429
00:19:47,187 --> 00:19:49,488
She kissed him!
430
00:19:49,489 --> 00:19:51,657
Ha ha! Ha ha!
431
00:19:51,658 --> 00:19:55,994
Bleh, you nailed
the dry-mouth
from reality tv show!
432
00:19:55,995 --> 00:19:59,264
Well, I guess I owe you
that 50 bucks now.
433
00:19:59,265 --> 00:20:02,801
Oh! 50 bucks! Yeah!
434
00:20:02,802 --> 00:20:06,438
[cash register bell]
ooh, yeah,
who's your daddy?
435
00:20:06,439 --> 00:20:09,908
I like the big one
and I like the one
over there. Ooh!
436
00:20:09,909 --> 00:20:13,245
Yeah. Hell, yeah!
[girls talking and laughing]
437
00:20:13,246 --> 00:20:14,880
Bleh: sam, bye-bye!
438
00:20:14,881 --> 00:20:16,048
Bye-bye, sam!
439
00:20:16,049 --> 00:20:18,150
[choked up] bye.
440
00:20:19,786 --> 00:20:21,854
Good-bye.
441
00:20:23,189 --> 00:20:24,823
You ok, man?
442
00:20:24,824 --> 00:20:28,560
I...Don't know
if i'll ever be ok.
443
00:20:28,561 --> 00:20:30,062
Yeah, i'm sorry.
444
00:20:30,063 --> 00:20:32,031
Hey, you want to go
grab a beer,
445
00:20:32,032 --> 00:20:34,533
Spin it, and kiss
whoever it points to?
446
00:20:34,534 --> 00:20:39,271
No. Not now, spanky.
Not now.
447
00:20:43,543 --> 00:20:44,543
How about now?
448
00:20:44,544 --> 00:20:45,811
Yeah. Ok.
449
00:20:45,812 --> 00:20:51,550
¶ girly, girly,
girly, girly girl ¶
450
00:20:51,551 --> 00:20:53,052
¶ girl ¶
451
00:20:53,053 --> 00:20:55,954
¶ girly, girly girl-- ¶
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment