Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
d0ed0d4b
Commit
d0ed0d4b
authored
May 17, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/codec/dvbsub.c: coding style changes.
parent
81333241
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
172 additions
and
173 deletions
+172
-173
modules/codec/dvbsub.c
modules/codec/dvbsub.c
+172
-173
No files found.
modules/codec/dvbsub.c
View file @
d0ed0d4b
...
...
@@ -2,8 +2,8 @@
* dvbsub.c : DVB subtitles decoder thread
*****************************************************************************
* Copyright (C) 2003 ANEVIA
* Copyright (C) 2003 VideoLAN
* $Id
: dvbsub.c,v 1.10 2004/03/02 13:53:13 kuehne Exp
$
* Copyright (C) 2003
-2004
VideoLAN
* $Id$
*
* Authors: Damien LUCAS <damien.lucas@anevia.com>
* Laurent Aimar <fenrir@via.ecp.fr>
...
...
@@ -43,32 +43,6 @@ vlc_module_begin();
set_callbacks
(
Open
,
Close
);
vlc_module_end
();
// Wow, that's ugly but very usefull for a memory leak track
// so I just keep it
#if 0
static long long unsigned int trox_malloc_nb = 0;
static long long unsigned int trox_free_nb = 0;
static void* trox_malloc (size_t size)
{ ++trox_malloc_nb; return malloc (size); }
static void trox_free (void* ptr)
{ ++trox_free_nb; free(ptr); return; }
static void trox_call ()
{
fprintf(stderr, "dvbbsub -- Memory usage: %llu mallocs %llu frees (%llu)\n",
trox_malloc_nb,
trox_free_nb,
trox_malloc_nb - trox_free_nb);
return;
}
#else
# define trox_malloc malloc
# define trox_free free
# define trox_call()
#endif
/****************************************************************************
* Local structures
****************************************************************************
...
...
@@ -97,6 +71,7 @@ typedef struct
uint16_t
i_cols
[
576
];
dvbsub_rle_t
*
p_last
;
dvbsub_rle_t
*
p_codes
;
}
dvbsub_image_t
;
/* The object definition gives the position of the object in a region */
...
...
@@ -110,6 +85,7 @@ typedef struct dvbsub_objectdef_s
uint8_t
i_fg_pc
;
uint8_t
i_bg_pc
;
struct
dvbsub_objectdef_s
*
p_next
;
}
dvbsub_objectdef_t
;
/* The Region is an aera on the image
...
...
@@ -130,7 +106,8 @@ typedef struct dvbsub_region_s
uint8_t
i_8bp_code
;
uint8_t
i_4bp_code
;
uint8_t
i_2bp_code
;
dvbsub_objectdef_t
*
p_object
;
dvbsub_objectdef_t
*
p_object
;
}
dvbsub_region_t
;
/* The page defines the list of regions */
...
...
@@ -142,6 +119,7 @@ typedef struct
uint8_t
i_version_number
;
uint8_t
i_regions_number
;
dvbsub_region_t
*
regions
;
}
dvbsub_page_t
;
/* An object is constituted of 2 images (for interleaving) */
...
...
@@ -154,6 +132,7 @@ typedef struct dvbsub_object_s
dvbsub_image_t
*
topfield
;
dvbsub_image_t
*
bottomfield
;
struct
dvbsub_object_s
*
p_next
;
}
dvbsub_object_t
;
/* The entry in the palette CLUT */
...
...
@@ -163,6 +142,7 @@ typedef struct
uint8_t
Cr
;
uint8_t
Cb
;
uint8_t
T
;
}
dvbsub_color_t
;
/* */
...
...
@@ -173,6 +153,7 @@ typedef struct
dvbsub_color_t
c_2b
[
0xff
];
dvbsub_color_t
c_4b
[
0xff
];
dvbsub_color_t
c_8b
[
0xff
];
}
dvbsub_clut_t
;
typedef
struct
...
...
@@ -181,6 +162,7 @@ typedef struct
uint16_t
i_y
;
dvbsub_image_t
*
p_rle_top
;
dvbsub_image_t
*
p_rle_bot
;
}
dvbsub_render_t
;
typedef
struct
...
...
@@ -193,6 +175,7 @@ typedef struct
dvbsub_page_t
*
p_page
;
dvbsub_object_t
*
p_objects
;
subpicture_t
*
p_spu
[
16
];
}
dvbsub_all_t
;
struct
subpicture_sys_t
...
...
@@ -243,11 +226,10 @@ static void Decode ( decoder_t *, block_t ** );
static
vout_thread_t
*
FindVout
(
decoder_t
*
);
static
int
dvbsub_init
(
dvbsub_all_t
*
,
int
);
static
void
dvbsub_decode_segment
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
dvbsub_render
(
dvbsub_all_t
*
,
vout_thread_t
*
);
static
void
dvbsub_clean
(
dvbsub_all_t
*
);
static
int
init
(
dvbsub_all_t
*
,
int
);
static
void
decode_segment
(
decoder_t
*
,
dvbsub_all_t
*
,
bs_t
*
);
static
void
render
(
dvbsub_all_t
*
,
vout_thread_t
*
);
static
void
dvbsub
(
dvbsub_all_t
*
);
/*****************************************************************************
* Open: probe the decoder and return score
...
...
@@ -266,11 +248,11 @@ static int Open( vlc_object_t *p_this )
}
p_dec
->
pf_decode_sub
=
Decode
;
p_sys
=
p_dec
->
p_sys
=
malloc
(
sizeof
(
decoder_sys_t
)
);
p_sys
=
p_dec
->
p_sys
=
malloc
(
sizeof
(
decoder_sys_t
)
);
p_sys
->
p_vout
=
NULL
;
dvbsub_
init
(
&
p_sys
->
dvbsub
,
p_dec
->
fmt_in
.
subs
.
dvb
.
i_id
);
init
(
&
p_sys
->
dvbsub
,
p_dec
->
fmt_in
.
subs
.
dvb
.
i_id
);
es_format_Init
(
&
p_dec
->
fmt_out
,
SPU_ES
,
VLC_FOURCC
(
'd'
,
'v'
,
'b'
,
's'
)
);
...
...
@@ -293,15 +275,15 @@ static void Close( vlc_object_t *p_this )
{
p_subpic
=
&
p_sys
->
p_vout
->
p_subpicture
[
i_subpic
];
if
(
p_subpic
!=
NULL
&&
(
(
p_subpic
->
i_status
==
RESERVED_SUBPICTURE
)
||
(
p_subpic
->
i_status
==
READY_SUBPICTURE
)
)
)
(
p_subpic
->
i_status
==
RESERVED_SUBPICTURE
||
p_subpic
->
i_status
==
READY_SUBPICTURE
)
)
{
vout_DestroySubPicture
(
p_sys
->
p_vout
,
p_subpic
);
}
}
}
dvbsub
_clean
(
&
p_sys
->
dvbsub
);
dvbsub
(
&
p_sys
->
dvbsub
);
free
(
p_sys
);
}
...
...
@@ -346,14 +328,14 @@ static void Decode( decoder_t *p_dec, block_t **pp_block )
{
break
;
}
d
vbsub_decode_segment
(
&
p_sys
->
dvbsub
,
&
p_sys
->
bs
);
d
ecode_segment
(
p_dec
,
&
p_sys
->
dvbsub
,
&
p_sys
->
bs
);
}
i_end_data_marker
=
bs_read
(
&
p_sys
->
bs
,
8
);
/* Check if the page is to be displayed */
if
(
p_sys
->
dvbsub
.
p_page
&&
p_sys
->
dvbsub
.
p_objects
)
{
dvbsub_
render
(
&
p_sys
->
dvbsub
,
p_sys
->
p_vout
);
render
(
&
p_sys
->
dvbsub
,
p_sys
->
p_vout
);
}
vlc_object_release
(
p_sys
->
p_vout
);
...
...
@@ -385,8 +367,7 @@ static vout_thread_t *FindVout( decoder_t *p_dec )
}
}
static
int
dvbsub_init
(
dvbsub_all_t
*
p_dvbsub
,
int
i_id
)
static
int
init
(
dvbsub_all_t
*
p_dvbsub
,
int
i_id
)
{
int
i
;
...
...
@@ -394,8 +375,8 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
p_dvbsub
->
i_pts
=
0
;
p_dvbsub
->
i_id
=
i_id
;
p_dvbsub
->
p_page
=
NULL
;
p_dvbsub
->
p_objects
=
NULL
;
p_dvbsub
->
p_page
=
NULL
;
p_dvbsub
->
p_objects
=
NULL
;
for
(
i
=
0
;
i
<
255
;
i
++
)
{
p_dvbsub
->
p_clut
[
i
]
=
NULL
;
...
...
@@ -409,22 +390,20 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
static
void
free_all
(
dvbsub_all_t
*
);
static
void
dvbsub
_clean
(
dvbsub_all_t
*
p_dvbsub
)
static
void
dvbsub
(
dvbsub_all_t
*
p_dvbsub
)
{
free_all
(
p_dvbsub
);
trox_call
()
;
}
static
void
decode_clut
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
decode_page_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
decode_region_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
stop_display
(
dvbsub_all_t
*
p_dvbsub
);
static
void
decode_object
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
dvbsub_decode_clut
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
dvbsub_decode_page_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
dvbsub_decode_region_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
dvbsub_stop_display
(
dvbsub_all_t
*
p_dvbsub
);
static
void
dvbsub_decode_object
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
);
static
void
free_page
(
dvbsub_page_t
*
p_p
);
static
void
free_page
(
dvbsub_page_t
*
p_p
);
static
void
d
vbsub_decode_segment
(
dvbsub_all_t
*
p_dvbspu
,
bs_t
*
s
)
static
void
d
ecode_segment
(
decoder_t
*
p_dec
,
dvbsub_all_t
*
p_dvbspu
,
bs_t
*
s
)
{
int
i_type
;
int
i_page_id
;
...
...
@@ -450,31 +429,45 @@ static void dvbsub_decode_segment( dvbsub_all_t *p_dvbspu, bs_t *s )
switch
(
i_type
)
{
case
DVBSUB_ST_CLUT_DEFINITION
:
dvbsub_decode_clut
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_PAGE_COMPOSITION
:
dvbsub_decode_page_composition
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_REGION_COMPOSITION
:
dvbsub_decode_region_composition
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_OBJECT_DATA
:
dvbsub_decode_object
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_ENDOFDISPLAY
:
dvbsub_stop_display
(
p_dvbspu
);
break
;
case
DVBSUB_ST_STUFFING
:
default:
fprintf
(
stderr
,
"DVBSUB - Unsupported segment type : (%04x)"
,
i_type
);
bs_skip
(
s
,
8
*
(
2
+
i_size
)
);
break
;
case
DVBSUB_ST_CLUT_DEFINITION
:
#ifdef DEBUG_DVBSUB
msg_Dbg
(
p_dec
,
"subtitle dvbsub_decode_clut"
);
#endif
decode_clut
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_PAGE_COMPOSITION
:
#ifdef DEBUG_DVBSUB
msg_Dbg
(
p_dec
,
"subtitle dvbsub_decode_page_composition"
);
#endif
decode_page_composition
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_REGION_COMPOSITION
:
#ifdef DEBUG_DVBSUB
msg_Dbg
(
p_dec
,
"subtitle dvbsub_decode_region_composition"
);
#endif
decode_region_composition
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_OBJECT_DATA
:
#ifdef DEBUG_DVBSUB
msg_Dbg
(
p_dec
,
"subtitle dvbsub_decode_object"
);
#endif
decode_object
(
p_dvbspu
,
s
);
break
;
case
DVBSUB_ST_ENDOFDISPLAY
:
#ifdef DEBUG_DVBSUB
msg_Dbg
(
p_dec
,
"subtitle dvbsub_stop_display"
);
#endif
stop_display
(
p_dvbspu
);
break
;
case
DVBSUB_ST_STUFFING
:
default:
msg_Warn
(
p_dec
,
"unsupported segment type: (%04x)"
,
i_type
);
bs_skip
(
s
,
8
*
(
2
+
i_size
)
);
break
;
}
}
static
void
dvbsub_
stop_display
(
dvbsub_all_t
*
p_dvbsub
)
static
void
stop_display
(
dvbsub_all_t
*
p_dvbsub
)
{
int
i
;
...
...
@@ -484,7 +477,7 @@ static void dvbsub_stop_display( dvbsub_all_t *p_dvbsub )
}
}
static
void
d
vbsub_d
ecode_clut
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
static
void
decode_clut
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
{
uint16_t
i_segment_length
;
uint16_t
i_processed_length
;
...
...
@@ -513,12 +506,11 @@ static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s )
}
else
{
p_dvbsub
->
p_clut
[
i_clut_id
]
=
trox_
malloc
(
sizeof
(
dvbsub_clut_t
)
);
p_dvbsub
->
p_clut
[
i_clut_id
]
=
malloc
(
sizeof
(
dvbsub_clut_t
)
);
}
clut
=
p_dvbsub
->
p_clut
[
i_clut_id
];
/* We don't have this version of the CLUT:
* Parse it */
/* We don't have this version of the CLUT: Parse it */
clut
->
i_version_number
=
i_version_number
;
bs_skip
(
s
,
4
);
/* Reserved bits */
i_processed_length
=
2
;
...
...
@@ -578,7 +570,7 @@ static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s )
}
}
static
void
d
vbsub_d
ecode_page_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
static
void
decode_page_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
{
unsigned
int
i_version_number
;
unsigned
int
i_state
;
...
...
@@ -589,9 +581,9 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
i_segment_length
=
bs_read
(
s
,
16
);
/* A page is composed by one or more region: */
i_timeout
=
bs_read
(
s
,
8
);
i_version_number
=
bs_read
(
s
,
4
);
i_state
=
bs_read
(
s
,
2
);
i_timeout
=
bs_read
(
s
,
8
);
i_version_number
=
bs_read
(
s
,
4
);
i_state
=
bs_read
(
s
,
2
);
/* TODO We assume it is a new page (i_state) */
if
(
p_dvbsub
->
p_page
)
free_page
(
p_dvbsub
->
p_page
);
...
...
@@ -599,22 +591,22 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
bs_skip
(
s
,
2
);
/* Reserved */
/* Allocate a new page */
p_dvbsub
->
p_page
=
trox_
malloc
(
sizeof
(
dvbsub_page_t
)
);
p_dvbsub
->
p_page
=
malloc
(
sizeof
(
dvbsub_page_t
)
);
p_dvbsub
->
p_page
->
i_timeout
=
i_timeout
;
/* Number of regions: */
p_dvbsub
->
p_page
->
i_regions_number
=
(
i_segment_length
-
2
)
/
6
;
/* Special workaround for CAVENA encoders
*
a page with no regions is sent
instead of a 0x80 packet (End Of Display) */
/* Special workaround for CAVENA encoders
: a page with no regions is sent
* instead of a 0x80 packet (End Of Display) */
if
(
p_dvbsub
->
p_page
->
i_regions_number
==
0
)
{
dvbsub_
stop_display
(
p_dvbsub
);
stop_display
(
p_dvbsub
);
}
/*
/Special
workaround */
/*
End of
workaround */
p_dvbsub
->
p_page
->
regions
=
trox_malloc
(
p_dvbsub
->
p_page
->
i_regions_number
*
sizeof
(
dvbsub_region_t
)
);
malloc
(
p_dvbsub
->
p_page
->
i_regions_number
*
sizeof
(
dvbsub_region_t
)
);
for
(
i
=
0
;
i
<
p_dvbsub
->
p_page
->
i_regions_number
;
i
++
)
{
p_dvbsub
->
p_page
->
regions
[
i
].
i_id
=
bs_read
(
s
,
8
);
...
...
@@ -626,7 +618,7 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
}
static
void
d
vbsub_d
ecode_region_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
static
void
decode_region_composition
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
{
dvbsub_region_t
*
p_region
=
NULL
;
unsigned
int
i_segment_length
;
...
...
@@ -684,7 +676,7 @@ static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
while
(
i_processed_length
<
i_segment_length
)
{
/* We create a new object */
dvbsub_objectdef_t
*
p_obj
=
trox_malloc
(
sizeof
(
dvbsub_objectdef_t
)
);
dvbsub_objectdef_t
*
p_obj
=
malloc
(
sizeof
(
dvbsub_objectdef_t
)
);
/* We parse object properties */
p_obj
->
p_next
=
NULL
;
...
...
@@ -725,16 +717,18 @@ static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
}
}
static
dvbsub_image_t
*
dvbsub_parse_pdata
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
,
uint16_t
length
);
static
uint16_t
dvbsub_count0x11
(
bs_t
*
s
,
uint16_t
*
p
,
dvbsub_image_t
*
p_image
);
static
dvbsub_image_t
*
dvbsub_parse_pdata
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
,
uint16_t
length
);
static
uint16_t
dvbsub_count0x11
(
bs_t
*
s
,
uint16_t
*
p
,
dvbsub_image_t
*
p_image
);
static
void
d
vbsub_d
ecode_object
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
static
void
decode_object
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
)
{
dvbsub_object_t
*
p_obj
;
uint16_t
i_segment_length
;
/* Memory Allocation */
p_obj
=
trox_malloc
(
sizeof
(
dvbsub_object_t
)
);
p_obj
=
malloc
(
sizeof
(
dvbsub_object_t
)
);
p_obj
->
p_next
=
NULL
;
i_segment_length
=
bs_read
(
s
,
16
);
...
...
@@ -748,20 +742,21 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
if
(
p_obj
->
i_coding_method
==
0x00
)
{
uint16_t
i_topfield_length
;
uint16_t
i_bottomfield_length
;
uint16_t
i_topfield_length
;
uint16_t
i_bottomfield_length
;
i_topfield_length
=
bs_read
(
s
,
16
);
i_bottomfield_length
=
bs_read
(
s
,
16
);
i_topfield_length
=
bs_read
(
s
,
16
);
i_bottomfield_length
=
bs_read
(
s
,
16
);
p_obj
->
topfield
=
dvbsub_parse_pdata
(
p_dvbsub
,
s
,
i_topfield_length
);
p_obj
->
bottomfield
=
dvbsub_parse_pdata
(
p_dvbsub
,
s
,
i_bottomfield_length
);
p_obj
->
topfield
=
dvbsub_parse_pdata
(
p_dvbsub
,
s
,
i_topfield_length
);
p_obj
->
bottomfield
=
dvbsub_parse_pdata
(
p_dvbsub
,
s
,
i_bottomfield_length
);
}
else
{
bs_skip
(
s
,
(
i_segment_length
-
3
)
*
8
);
/*TODO
* DVB subtitling as characters */
/*TODO: DVB subtitling as characters */
}
/* Add this object to the list of the page */
...
...
@@ -769,17 +764,18 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
p_dvbsub
->
p_objects
=
p_obj
;
}
static
dvbsub_image_t
*
dvbsub_parse_pdata
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
,
uint16_t
length
)
static
dvbsub_image_t
*
dvbsub_parse_pdata
(
dvbsub_all_t
*
p_dvbsub
,
bs_t
*
s
,
uint16_t
length
)
{
dvbsub_image_t
*
p_image
;
uint16_t
i_processed_length
=
0
;
uint16_t
i_lines
=
0
;
uint16_t
i_cols_last
=
0
;
uint16_t
i_processed_length
=
0
;
uint16_t
i_lines
=
0
;
uint16_t
i_cols_last
=
0
;
p_image
=
trox_malloc
(
sizeof
(
dvbsub_image_t
)
);
p_image
->
p_last
=
NULL
;
p_image
=
malloc
(
sizeof
(
dvbsub_image_t
)
);
p_image
->
p_last
=
NULL
;
memset
(
p_image
->
i_cols
,
0
,
576
*
sizeof
(
uint16_t
)
);
memset
(
p_image
->
i_cols
,
0
,
576
*
sizeof
(
uint16_t
)
);
/* Let's parse it a first time to determine the size of the buffer */
while
(
i_processed_length
<
length
)
...
...
@@ -825,18 +821,16 @@ static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s, uint
return
p_image
;
}
static
void
add_rle_code
(
dvbsub_image_t
*
p
,
uint16_t
num
,
uint8_t
color
)
{
if
(
p
->
p_last
!=
NULL
)
{
p
->
p_last
->
p_next
=
trox_malloc
(
sizeof
(
dvbsub_rle_t
)
);
p
->
p_last
->
p_next
=
malloc
(
sizeof
(
dvbsub_rle_t
)
);
p
->
p_last
=
p
->
p_last
->
p_next
;
}
else
{
p
->
p_codes
=
trox_malloc
(
sizeof
(
dvbsub_rle_t
)
);
p
->
p_codes
=
malloc
(
sizeof
(
dvbsub_rle_t
)
);
p
->
p_last
=
p
->
p_codes
;
}
p
->
p_last
->
i_num
=
num
;
...
...
@@ -844,8 +838,8 @@ static void add_rle_code( dvbsub_image_t *p, uint16_t num, uint8_t color )
p
->
p_last
->
p_next
=
NULL
;
}
static
uint16_t
dvbsub_count0x11
(
bs_t
*
s
,
uint16_t
*
p
,
dvbsub_image_t
*
p_image
)
static
uint16_t
dvbsub_count0x11
(
bs_t
*
s
,
uint16_t
*
p
,
dvbsub_image_t
*
p_image
)
{
uint16_t
i_processed
=
0
;
vlc_bool_t
b_stop
=
0
;
...
...
@@ -936,16 +930,16 @@ static void free_image (dvbsub_image_t* p_i)
for
(
p1
=
p_i
->
p_codes
;
p1
!=
NULL
;
p1
=
p2
)
{
p2
=
p1
->
p_next
;
trox_
free
(
p1
);
free
(
p1
);
p1
=
NULL
;
}
trox_
free
(
p_i
);
free
(
p_i
);
}
static
void
free_object
(
dvbsub_object_t
*
p_o
)
{
trox_
free
(
p_o
);
free
(
p_o
);
}
static
void
free_objectdefs
(
dvbsub_objectdef_t
*
p_o
)
...
...
@@ -956,7 +950,7 @@ static void free_objectdefs ( dvbsub_objectdef_t* p_o)
for
(
p1
=
p_o
;
p1
!=
NULL
;
p1
=
p2
)
{
p2
=
p1
->
p_next
;
trox_
free
(
p1
);
free
(
p1
);
p1
=
NULL
;
}
}
...
...
@@ -966,7 +960,7 @@ static void free_regions (dvbsub_region_t* p_r, uint8_t nb)
unsigned
int
i
;
for
(
i
=
0
;
i
<
nb
;
i
++
)
free_objectdefs
(
p_r
[
i
].
p_object
);
trox_
free
(
p_r
);
free
(
p_r
);
p_r
=
NULL
;
}
...
...
@@ -986,13 +980,13 @@ static void free_objects (dvbsub_object_t* p_o)
static
void
free_clut
(
dvbsub_clut_t
*
p_c
)
{
trox_
free
(
p_c
);
free
(
p_c
);
}
static
void
free_page
(
dvbsub_page_t
*
p_p
)
{
free_regions
(
p_p
->
regions
,
p_p
->
i_regions_number
);
trox_
free
(
p_p
);
free
(
p_p
);
p_p
=
NULL
;
}
...
...
@@ -1002,8 +996,8 @@ static void free_spu( subpicture_t *p_spu )
{
free_image
(((
dvbsub_render_t
*
)
p_spu
->
p_sys
->
p_data
)
->
p_rle_top
);
free_image
(((
dvbsub_render_t
*
)
p_spu
->
p_sys
->
p_data
)
->
p_rle_bot
);
trox_
free
(
p_spu
->
p_sys
->
p_data
);
trox_
free
(
p_spu
->
p_sys
);
free
(
p_spu
->
p_sys
->
p_data
);
free
(
p_spu
->
p_sys
);
p_spu
->
p_sys
=
NULL
;
}
}
...
...
@@ -1035,7 +1029,7 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
//let's render the 1st frame
for
(
p_c
=
p_im
->
p_codes
;
p_c
->
p_next
!=
NULL
;
p_c
=
p_c
->
p_next
)
{
//
if( p_c->y != 0 && p_c->t < 0x20)
//
if( p_c->y != 0 && p_c->t < 0x20)
if
(
p_c
->
y
!=
0
&&
p_c
->
t
<
0x20
)
{
x
=
j
+
p_r
->
i_x
;
...
...
@@ -1045,9 +1039,9 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
for
(
i_cnt
=
0
;
i_cnt
<
p_c
->
i_num
;
i_cnt
+=
2
)
{
memset
(
p_desty
+
y
*
p_pic
->
Y_PITCH
+
2
*
x
+
i_cnt
,
p_c
->
y
,
1
);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
}
}
j
+=
p_c
->
i_num
;
...
...
@@ -1070,9 +1064,9 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
for
(
i_cnt
=
0
;
i_cnt
<
p_c
->
i_num
;
i_cnt
+=
2
)
{
memset
(
p_desty
+
y
*
p_pic
->
Y_PITCH
+
2
*
x
+
i_cnt
,
p_c
->
y
,
1
);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
//
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
}
}
j
+=
p_c
->
i_num
;
...
...
@@ -1084,7 +1078,6 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
}
}
static
void
RenderI42x
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
)
{
...
...
@@ -1110,12 +1103,12 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
x
=
j
+
p_r
->
i_x
;
y
=
2
*
i
+
p_r
->
i_y
;
//memset(p_dest+ y*p_pic->U_PITCH*2 + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ (y)*p_pic->Y_PITCH + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ (y)*p_pic->Y_PITCH + x, p_c->cr, p_c->i_num);
//memset(p_dest+ y*p_pic->V_PITCH*2 + x, p_c->cb, p_c->i_num);
//memset(p_destu+ (y)*p_pic->Y_PITCH + x, p_c->cb, p_c->i_num);
memset
(
p_desty
+
y
*
p_pic
->
Y_PITCH
+
x
,
p_c
->
y
,
p_c
->
i_num
);
//
memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
//
memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
}
j
+=
p_c
->
i_num
;
if
(
j
>=
p_im
->
i_cols
[
i
])
...
...
@@ -1132,11 +1125,11 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
{
x
=
j
+
p_r
->
i_x
;
y
=
2
*
i
+
1
+
p_r
->
i_y
;
//
memset(p_desty+ y*p_pic->U_PITCH*2 + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ y*p_pic->V_PITCH*2 + x, p_c->cb, p_c->i_num);
//
memset(p_desty+ y*p_pic->U_PITCH*2 + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ y*p_pic->V_PITCH*2 + x, p_c->cb, p_c->i_num);
memset
(
p_desty
+
y
*
p_pic
->
Y_PITCH
+
x
,
p_c
->
y
,
p_c
->
i_num
);
//
memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
//
memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
//
memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
}
j
+=
p_c
->
i_num
;
if
(
j
>=
p_im
->
i_cols
[
i
])
...
...
@@ -1147,8 +1140,8 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
}
}
static
void
dvbsub_
RenderDVBSUB
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
)
static
void
RenderDVBSUB
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
)
{
/* If we have changed the language on the fly */
...
...
@@ -1199,7 +1192,7 @@ static void dvbsub_Destroy( subpicture_t *p_spu )
free_spu
(
p_spu
);
}
static
void
dvbsub_
render
(
dvbsub_all_t
*
dvbsub
,
vout_thread_t
*
p_vout
)
static
void
render
(
dvbsub_all_t
*
dvbsub
,
vout_thread_t
*
p_vout
)
{
dvbsub_region_t
*
p_region
;
dvbsub_objectdef_t
*
p_objectdef
;
...
...
@@ -1208,8 +1201,7 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
dvbsub_object_t
*
p_object_old
;
dvbsub_render_t
*
p_render
;
dvbsub_rle_t
*
p_c
;
uint8_t
i
,
j
;
j
=
0
;
uint8_t
i
,
j
=
0
;
/* loop on regions */
for
(
i
=
0
;
i
<
dvbsub
->
p_page
->
i_regions_number
;
i
++
)
...
...
@@ -1217,77 +1209,85 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
p_region
=
&
(
dvbsub
->
p_page
->
regions
[
i
]);
/* loop on objects */
for
(
p_objectdef
=
p_region
->
p_object
;
p_objectdef
!=
NULL
;
p_objectdef
=
p_objectdef
->
p_next
)
for
(
p_objectdef
=
p_region
->
p_object
;
p_objectdef
!=
NULL
;
p_objectdef
=
p_objectdef
->
p_next
)
{
/* Look for the right object */
p_object
=
dvbsub
->
p_objects
;
while
(
(
p_object
!=
NULL
)
&&
(
p_object
->
i_id
!=
p_objectdef
->
i_id
)
)
while
(
!
p_object
&&
p_object
->
i_id
!=
p_objectdef
->
i_id
)
{
p_object
=
p_object
->
p_next
;
}
if
(
p_object
==
NULL
)
if
(
!
p_object
)
{
msg_Err
(
p_vout
,
"internal DvbSub
decoder error"
);
msg_Err
(
p_vout
,
"internal
decoder error"
);
return
;
}
/* Allocate the render structure */
p_render
=
trox_malloc
(
sizeof
(
dvbsub_render_t
)
);
p_render
=
malloc
(
sizeof
(
dvbsub_render_t
)
);
p_render
->
i_x
=
p_region
->
i_x
+
p_objectdef
->
i_xoffset
;
p_render
->
i_y
=
p_region
->
i_y
+
p_objectdef
->
i_yoffset
;
p_render
->
p_rle_top
=
p_object
->
topfield
;
p_render
->
p_rle_bot
=
p_object
->
bottomfield
;
// if we did not recieved the CLUT yet
if
(
!
dvbsub
->
p_clut
[
p_region
->
i_clut
]
)
return
;
if
(
!
dvbsub
->
p_clut
[
p_region
->
i_clut
]
)
return
;
/* Compute the color datas according to the appropriate CLUT */
for
(
p_c
=
p_render
->
p_rle_top
->
p_codes
;
p_c
->
p_next
!=
NULL
;
p_c
=
p_c
->
p_next
)
for
(
p_c
=
p_render
->
p_rle_top
->
p_codes
;
p_c
->
p_next
!=
NULL
;
p_c
=
p_c
->
p_next
)
{
//TODO We assume here we are working in 4bp
p_c
->
y
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Y
;
p_c
->
cr
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cr
;
p_c
->
cb
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cb
;
p_c
->
t
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
T
;
p_c
->
y
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Y
;
p_c
->
cr
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cr
;
p_c
->
cb
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cb
;
p_c
->
t
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
T
;
}
for
(
p_c
=
p_render
->
p_rle_bot
->
p_codes
;
p_c
->
p_next
!=
NULL
;
p_c
=
p_c
->
p_next
)
for
(
p_c
=
p_render
->
p_rle_bot
->
p_codes
;
p_c
->
p_next
!=
NULL
;
p_c
=
p_c
->
p_next
)
{
//TODO We assume here we are working in 4bp
p_c
->
y
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Y
;
p_c
->
cr
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cr
;
p_c
->
cb
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cb
;
p_c
->
t
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
T
;
p_c
->
y
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Y
;
p_c
->
cr
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cr
;
p_c
->
cb
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
Cb
;
p_c
->
t
=
dvbsub
->
p_clut
[
p_region
->
i_clut
]
->
c_4b
[
p_c
->
i_color_code
].
T
;
}
/* Allocate the subpicture internal data. */
dvbsub
->
p_spu
[
j
]
=
vout_CreateSubPicture
(
p_vout
,
MEMORY_SUBPICTURE
);
dvbsub
->
p_spu
[
j
]
=
vout_CreateSubPicture
(
p_vout
,
MEMORY_SUBPICTURE
);
if
(
dvbsub
->
p_spu
[
j
]
==
NULL
)
{
msg_Err
(
p_vout
,
"Unable to allocate memory, skipping"
);
return
;
}
/* Set the pf_render callback */
dvbsub
->
p_spu
[
j
]
->
pf_render
=
dvbsub_
RenderDVBSUB
;
dvbsub
->
p_spu
[
j
]
->
p_sys
=
trox_malloc
(
sizeof
(
subpicture_sys_t
)
);
dvbsub
->
p_spu
[
j
]
->
pf_render
=
RenderDVBSUB
;
dvbsub
->
p_spu
[
j
]
->
p_sys
=
malloc
(
sizeof
(
subpicture_sys_t
)
);
dvbsub
->
p_spu
[
j
]
->
p_sys
->
p_data
=
p_render
;
dvbsub
->
p_spu
[
j
]
->
p_sys
->
b_obsolete
=
0
;
dvbsub
->
p_spu
[
j
]
->
p_sys
->
b_obsolete
=
0
;
dvbsub
->
p_spu
[
j
]
->
pf_destroy
=
dvbsub_Destroy
;
dvbsub
->
p_spu
[
j
]
->
i_start
=
dvbsub
->
i_pts
;
dvbsub
->
p_spu
[
j
]
->
i_stop
=
dvbsub
->
p_spu
[
j
]
->
i_start
+
dvbsub
->
p_page
->
i_timeout
*
1000000
;
dvbsub
->
p_spu
[
j
]
->
i_stop
=
dvbsub
->
p_spu
[
j
]
->
i_start
+
dvbsub
->
p_page
->
i_timeout
*
1000000
;
dvbsub
->
p_spu
[
j
]
->
b_ephemer
=
VLC_FALSE
;
// At this stage, we have all we need in p_render
// We need to free the object
//Remove this object from the list
p_object_old
=
p_object
;
if
(
p_object
==
dvbsub
->
p_objects
)
dvbsub
->
p_objects
=
p_object
->
p_next
;
if
(
p_object
==
dvbsub
->
p_objects
)
{
dvbsub
->
p_objects
=
p_object
->
p_next
;
}
else
{
for
(
p_o
=
dvbsub
->
p_objects
;
p_o
->
p_next
!=
p_object
;
p_o
=
p_o
->
p_next
);
p_o
->
p_next
=
p_object
->
p_next
;
for
(
p_o
=
dvbsub
->
p_objects
;
p_o
->
p_next
!=
p_object
;
p_o
=
p_o
->
p_next
);
p_o
->
p_next
=
p_object
->
p_next
;
}
free_object
(
p_object_old
);
...
...
@@ -1297,4 +1297,3 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
}
}
}
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