Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
7d55d5ee
Commit
7d55d5ee
authored
May 19, 2009
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed some dvd spu streams that have multiple palette/alpha per packet.
parent
083927e3
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
28 deletions
+44
-28
modules/codec/spudec/parse.c
modules/codec/spudec/parse.c
+44
-28
No files found.
modules/codec/spudec/parse.c
View file @
7d55d5ee
...
...
@@ -170,10 +170,27 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
/* Command and date */
uint8_t
i_command
=
SPU_CMD_END
;
mtime_t
date
=
0
;
bool
b_cmd_offset
=
false
;
bool
b_cmd_alpha
=
false
;
subpicture_data_t
spu_data_cmd
;
if
(
!
p_spu
||
!
p_spu_data
)
return
VLC_EGENERIC
;
/* Create working space for spu data */
memset
(
&
spu_data_cmd
,
0
,
sizeof
(
spu_data_cmd
)
);
spu_data_cmd
.
pi_offset
[
0
]
=
-
1
;
spu_data_cmd
.
pi_offset
[
1
]
=
-
1
;
spu_data_cmd
.
p_data
=
NULL
;
spu_data_cmd
.
b_palette
=
false
;
spu_data_cmd
.
b_auto_crop
=
false
;
spu_data_cmd
.
i_y_top_offset
=
0
;
spu_data_cmd
.
i_y_bottom_offset
=
0
;
spu_data_cmd
.
pi_alpha
[
0
]
=
0x00
;
spu_data_cmd
.
pi_alpha
[
1
]
=
0x0f
;
spu_data_cmd
.
pi_alpha
[
2
]
=
0x0f
;
spu_data_cmd
.
pi_alpha
[
3
]
=
0x0f
;
/* Initialize the structure */
p_spu
->
i_start
=
p_spu
->
i_stop
=
0
;
p_spu
->
b_ephemer
=
false
;
...
...
@@ -181,18 +198,7 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
memset
(
p_spu_properties
,
0
,
sizeof
(
*
p_spu_properties
)
);
/* */
p_spu_data
->
pi_offset
[
0
]
=
-
1
;
p_spu_data
->
pi_offset
[
1
]
=
-
1
;
p_spu_data
->
p_data
=
NULL
;
p_spu_data
->
b_palette
=
false
;
p_spu_data
->
b_auto_crop
=
false
;
p_spu_data
->
i_y_top_offset
=
0
;
p_spu_data
->
i_y_bottom_offset
=
0
;
p_spu_data
->
pi_alpha
[
0
]
=
0x00
;
p_spu_data
->
pi_alpha
[
1
]
=
0x0f
;
p_spu_data
->
pi_alpha
[
2
]
=
0x0f
;
p_spu_data
->
pi_alpha
[
3
]
=
0x0f
;
*
p_spu_data
=
spu_data_cmd
;
for
(
i_index
=
4
+
p_sys
->
i_rle_size
;
i_index
<
p_sys
->
i_spu_size
;
)
{
...
...
@@ -206,6 +212,9 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
return
VLC_EGENERIC
;
}
/* */
b_cmd_offset
=
false
;
b_cmd_alpha
=
false
;
/* Get the control sequence date */
date
=
(
mtime_t
)
GetWBE
(
&
p_sys
->
buffer
[
i_index
]
)
*
11000
;
...
...
@@ -257,7 +266,7 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
unsigned
int
idx
[
4
];
int
i
;
p_spu_data
->
b_palette
=
true
;
spu_data_cmd
.
b_palette
=
true
;
idx
[
0
]
=
(
p_sys
->
buffer
[
i_index
+
1
]
>>
4
)
&
0x0f
;
idx
[
1
]
=
(
p_sys
->
buffer
[
i_index
+
1
])
&
0x0f
;
...
...
@@ -269,9 +278,9 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
uint32_t
i_color
=
p_dec
->
fmt_in
.
subs
.
spu
.
palette
[
1
+
idx
[
i
]];
/* FIXME: this job should be done sooner */
p_spu_data
->
pi_yuv
[
3
-
i
][
0
]
=
(
i_color
>>
16
)
&
0xff
;
p_spu_data
->
pi_yuv
[
3
-
i
][
1
]
=
(
i_color
>>
0
)
&
0xff
;
p_spu_data
->
pi_yuv
[
3
-
i
][
2
]
=
(
i_color
>>
8
)
&
0xff
;
spu_data_cmd
.
pi_yuv
[
3
-
i
][
0
]
=
(
i_color
>>
16
)
&
0xff
;
spu_data_cmd
.
pi_yuv
[
3
-
i
][
1
]
=
(
i_color
>>
0
)
&
0xff
;
spu_data_cmd
.
pi_yuv
[
3
-
i
][
2
]
=
(
i_color
>>
8
)
&
0xff
;
}
}
...
...
@@ -285,10 +294,11 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
return
VLC_EGENERIC
;
}
p_spu_data
->
pi_alpha
[
3
]
=
(
p_sys
->
buffer
[
i_index
+
1
]
>>
4
)
&
0x0f
;
p_spu_data
->
pi_alpha
[
2
]
=
(
p_sys
->
buffer
[
i_index
+
1
])
&
0x0f
;
p_spu_data
->
pi_alpha
[
1
]
=
(
p_sys
->
buffer
[
i_index
+
2
]
>>
4
)
&
0x0f
;
p_spu_data
->
pi_alpha
[
0
]
=
(
p_sys
->
buffer
[
i_index
+
2
])
&
0x0f
;
b_cmd_alpha
=
true
;
spu_data_cmd
.
pi_alpha
[
3
]
=
(
p_sys
->
buffer
[
i_index
+
1
]
>>
4
)
&
0x0f
;
spu_data_cmd
.
pi_alpha
[
2
]
=
(
p_sys
->
buffer
[
i_index
+
1
])
&
0x0f
;
spu_data_cmd
.
pi_alpha
[
1
]
=
(
p_sys
->
buffer
[
i_index
+
2
]
>>
4
)
&
0x0f
;
spu_data_cmd
.
pi_alpha
[
0
]
=
(
p_sys
->
buffer
[
i_index
+
2
])
&
0x0f
;
i_index
+=
3
;
break
;
...
...
@@ -324,12 +334,25 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
return
VLC_EGENERIC
;
}
b_cmd_offset
=
true
;
p_spu_data
->
pi_offset
[
0
]
=
GetWBE
(
&
p_sys
->
buffer
[
i_index
+
1
])
-
4
;
p_spu_data
->
pi_offset
[
1
]
=
GetWBE
(
&
p_sys
->
buffer
[
i_index
+
3
])
-
4
;
i_index
+=
5
;
break
;
case
SPU_CMD_END
:
/* ff (end) */
if
(
b_cmd_offset
)
{
/* It seems that palette and alpha from the block having
* the cmd offset have to be used
* XXX is it all ? */
p_spu_data
->
b_palette
=
spu_data_cmd
.
b_palette
;
if
(
spu_data_cmd
.
b_palette
)
memcpy
(
p_spu_data
->
pi_yuv
,
spu_data_cmd
.
pi_yuv
,
sizeof
(
spu_data_cmd
.
pi_yuv
)
);
if
(
b_cmd_alpha
)
memcpy
(
p_spu_data
->
pi_alpha
,
spu_data_cmd
.
pi_alpha
,
sizeof
(
spu_data_cmd
.
pi_alpha
)
);
}
i_index
+=
1
;
break
;
...
...
@@ -359,16 +382,9 @@ static int ParseControlSeq( decoder_t *p_dec, subpicture_t *p_spu,
}
}
/* We need to check for quit commands here */
if
(
!
vlc_object_alive
(
p_dec
)
)
{
return
VLC_EGENERIC
;
}
/* */
if
(
i_command
==
SPU_CMD_END
&&
i_index
!=
i_next_seq
)
{
break
;
}
}
/* Check that the next sequence index matches the current one */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment