Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
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
Commits
3f1d1208
Commit
3f1d1208
authored
Nov 01, 2007
by
Jean-Paul Saman
Committed by
Jean-Paul Saman
Mar 05, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Backport of zvbi enhances from vlc/trunk.
parent
f223abfa
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
295 additions
and
88 deletions
+295
-88
modules/codec/zvbi.c
modules/codec/zvbi.c
+295
-88
No files found.
modules/codec/zvbi.c
View file @
3f1d1208
...
...
@@ -2,9 +2,9 @@
* zvbi.c : VBI and Teletext PES demux and decoder using libzvbi
*****************************************************************************
* Copyright (C) 2007, M2X
* $Id$
* $Id
:
$
*
* Authors: Derk-Jan Hartman <djhartman at m2x dot nl>
for M2X
* Authors: Derk-Jan Hartman <djhartman at m2x dot nl>
* Jean-Paul Saman <jpsaman at m2x dot nl>
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -21,6 +21,12 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
*
* information on teletext format can be found here :
* http://pdc.ro.nu/teletext.html
*
*****************************************************************************/
/* This module implements:
* ETSI EN 301 775: VBI data in PES
...
...
@@ -30,15 +36,17 @@
* ETSI EN 300 294: 625-line Wide Screen Signaling [WSS] (libzvbi)
* EIA-608 Revision A: Closed Captioning [CC] (libzvbi)
*/
#include <vlc/vlc.h>
#include <assert.h>
#include <stdint.h>
#include <libzvbi.h>
#include <vlc/vout.h>
#include "vlc_bits.h"
#include "vlc_codec.h"
#include "vlc_block.h"
#include "vlc_image.h"
typedef
enum
{
DATA_UNIT_EBU_TELETEXT_NON_SUBTITLE
=
0x02
,
...
...
@@ -72,7 +80,7 @@ static subpicture_t *Decode( decoder_t *, block_t ** );
#define OPAQUE_LONGTEXT N_("Setting vbi-opaque to false " \
"makes the boxed text transparent." )
#define POS_TEXT N_("Teletext
position
")
#define POS_TEXT N_("Teletext
alignment
")
#define POS_LONGTEXT N_( \
"You can enforce the teletext position on the video " \
"(0=center, 1=left, 2=right, 4=top, 8=bottom, you can " \
...
...
@@ -83,7 +91,7 @@ static subpicture_t *Decode( decoder_t *, block_t ** );
"instead of as RGBA" )
static
int
pi_pos_values
[]
=
{
0
,
1
,
2
,
4
,
8
,
5
,
6
,
9
,
10
};
static
char
*
ppsz_pos_descriptions
[]
=
static
c
onst
c
har
*
ppsz_pos_descriptions
[]
=
{
N_
(
"Center"
),
N_
(
"Left"
),
N_
(
"Right"
),
N_
(
"Top"
),
N_
(
"Bottom"
),
N_
(
"Top-Left"
),
N_
(
"Top-Right"
),
N_
(
"Bottom-Left"
),
N_
(
"Bottom-Right"
)
};
...
...
@@ -102,7 +110,7 @@ vlc_module_begin();
add_integer
(
"vbi-position"
,
4
,
NULL
,
POS_TEXT
,
POS_LONGTEXT
,
VLC_FALSE
);
change_integer_list
(
pi_pos_values
,
ppsz_pos_descriptions
,
0
);
add_bool
(
"vbi-text"
,
VLC_FALSE
,
NULL
,
TELX_TEXT
,
TELX_LONGTEXT
,
VLC_FALSE
);
TELX_TEXT
,
TELX_LONGTEXT
,
VLC_FALSE
);
vlc_module_end
();
/****************************************************************************
...
...
@@ -123,16 +131,27 @@ struct decoder_sys_t
/* Positioning of Teletext images */
int
i_align
;
/* Misc */
#ifdef HAVE_FFMPEG_SWSCALE_H
image_handler_t
*
p_image
;
#endif
};
static
void
event_handler
(
vbi_event
*
ev
,
void
*
user_data
);
static
void
event_handler
(
vbi_event
*
ev
,
void
*
user_data
);
static
int
RequestPage
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
);
static
int
OpaquePage
(
decoder_t
*
p_dec
,
vbi_page
p_page
,
video_format_t
fmt
,
picture_t
**
p_src
);
static
int
Opaque_32bpp
(
decoder_t
*
p_dec
,
vbi_page
p_page
,
video_format_t
fmt
,
picture_t
**
p_src
);
static
int
Opaque_8bpp
(
decoder_t
*
p_dec
,
vbi_page
p_page
,
video_format_t
fmt
,
picture_t
**
p_src
);
static
int
Opaque
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
);
static
int
Position
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
);
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
);
/*****************************************************************************
* Open: probe the decoder and return score
...
...
@@ -147,8 +166,6 @@ static int Open( vlc_object_t *p_this )
if
(
p_dec
->
fmt_in
.
i_codec
!=
VLC_FOURCC
(
't'
,
'e'
,
'l'
,
'x'
)
)
{
msg_Err
(
p_dec
,
"fourcc '%4.4s' not supported"
,
(
char
*
)
&
p_dec
->
fmt_in
.
i_codec
);
return
VLC_EGENERIC
;
}
...
...
@@ -161,6 +178,17 @@ static int Open( vlc_object_t *p_this )
}
memset
(
p_sys
,
0
,
sizeof
(
decoder_sys_t
)
);
#ifdef HAVE_FFMPEG_SWSCALE_H
p_sys
->
p_image
=
image_HandlerCreate
(
VLC_OBJECT
(
p_dec
)
);
if
(
!
p_sys
->
p_image
)
{
free
(
p_sys
);
msg_Err
(
p_dec
,
"out of memory"
);
return
VLC_ENOMEM
;
}
#endif
p_sys
->
b_update
=
VLC_FALSE
;
p_sys
->
p_vbi_dec
=
vbi_decoder_new
();
p_sys
->
p_dvb_demux
=
vbi_dvb_pes_demux_new
(
NULL
,
NULL
);
...
...
@@ -170,14 +198,16 @@ static int Open( vlc_object_t *p_this )
Close
(
p_this
);
return
VLC_ENOMEM
;
}
vbi_event_handler_register
(
p_sys
->
p_vbi_dec
,
VBI_EVENT_TTX_PAGE
|
VBI_EVENT_CAPTION
|
VBI_EVENT_NETWORK
|
VBI_EVENT_ASPECT
|
VBI_EVENT_PROG_INFO
,
event_handler
,
p_dec
);
vbi_event_handler_register
(
p_sys
->
p_vbi_dec
,
VBI_EVENT_TTX_PAGE
|
VBI_EVENT_CAPTION
|
VBI_EVENT_NETWORK
|
VBI_EVENT_ASPECT
|
VBI_EVENT_PROG_INFO
,
event_handler
,
p_dec
);
/* Create the var on vlc_global. */
p_sys
->
i_wanted_page
=
var_CreateGetInteger
(
p_dec
->
p_libvlc
,
"vbi-page"
);
var_AddCallback
(
p_dec
->
p_libvlc
,
"vbi-page"
,
RequestPage
,
p_sys
);
var_AddCallback
(
p_dec
->
p_libvlc
,
"vbi-page"
,
RequestPage
,
p_sys
);
p_sys
->
b_opaque
=
var_CreateGetBool
(
p_dec
,
"vbi-opaque"
);
var_AddCallback
(
p_dec
,
"vbi-opaque"
,
Opaque
,
p_sys
);
...
...
@@ -192,8 +222,11 @@ static int Open( vlc_object_t *p_this )
if
(
p_sys
->
b_text
)
p_dec
->
fmt_out
.
video
.
i_chroma
=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
);
else
#ifdef HAVE_FFMPEG_SWSCALE_H
p_dec
->
fmt_out
.
video
.
i_chroma
=
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
);
#else
p_dec
->
fmt_out
.
video
.
i_chroma
=
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'A'
);
#endif
return
VLC_SUCCESS
;
}
...
...
@@ -205,31 +238,29 @@ static void Close( vlc_object_t *p_this )
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
if
(
p_sys
->
p_vbi_dec
)
vbi_decoder_delete
(
p_sys
->
p_vbi_dec
);
#ifdef HAVE_FFMPEG_SWSCALE_H
if
(
p_sys
->
p_image
)
image_HandlerDelete
(
p_sys
->
p_image
);
#endif
if
(
p_sys
->
p_vbi_dec
)
vbi_decoder_delete
(
p_sys
->
p_vbi_dec
);
if
(
p_sys
->
p_dvb_demux
)
vbi_dvb_demux_delete
(
p_sys
->
p_dvb_demux
);
free
(
p_sys
);
}
#define MAX_SLICES 32
/*****************************************************************************
* Decode:
*****************************************************************************/
static
subpicture_t
*
Decode
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
decoder_sys_t
*
p_sys
=
(
decoder_sys_t
*
)
p_dec
->
p_sys
;
block_t
*
p_block
;
subpicture_t
*
p_spu
=
NULL
;
video_format_t
fmt
;
vlc_bool_t
b_cached
=
VLC_FALSE
;
vbi_page
p_page
;
const
uint8_t
*
p_pos
;
unsigned
int
i_left
;
/* part of kludge */
uint32_t
*
p_begin
,
*
p_end
;
unsigned
int
x
=
0
,
y
=
0
;
vbi_opacity
opacity
;
/* end part of kludge */
const
uint8_t
*
p_pos
;
unsigned
int
i_left
;
if
(
(
pp_block
==
NULL
)
||
(
*
pp_block
==
NULL
)
)
return
NULL
;
...
...
@@ -244,7 +275,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
{
vbi_sliced
p_sliced
[
MAX_SLICES
];
unsigned
int
i_lines
=
0
;
int64_t
i_pts
=
0
;
int64_t
i_pts
;
i_lines
=
vbi_dvb_demux_cor
(
p_sys
->
p_dvb_demux
,
p_sliced
,
MAX_SLICES
,
&
i_pts
,
&
p_pos
,
&
i_left
);
...
...
@@ -262,15 +293,16 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
if
(
!
b_cached
)
goto
error
;
if
(
(
p_sys
->
i_wanted_page
==
p_sys
->
i_last_page
)
&&
(
p_sys
->
b_update
!=
VLC_TRUE
)
)
if
(
(
p_sys
->
i_wanted_page
==
p_sys
->
i_last_page
)
&&
(
p_sys
->
b_update
!=
VLC_TRUE
)
)
goto
error
;
p_sys
->
i_last_page
=
p_sys
->
i_wanted_page
;
p_sys
->
b_update
=
VLC_FALSE
;
p_sys
->
i_last_page
=
p_sys
->
i_wanted_page
;
#if 0
msg_Dbg( p_dec, "we now have page: %d ready for display",
p_sys
->
i_wanted_page
);
p_sys->i_wanted_page );
#endif
/* If there is a page or sub to render, then we do that here */
/* Create the subpicture unit */
p_spu
=
p_dec
->
pf_spu_buffer_new
(
p_dec
);
...
...
@@ -282,8 +314,13 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
/* Create a new subpicture region */
memset
(
&
fmt
,
0
,
sizeof
(
video_format_t
)
);
fmt
.
i_chroma
=
p_sys
->
b_text
?
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
:
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'A'
);
fmt
.
i_aspect
=
VOUT_ASPECT_FACTOR
;
fmt
.
i_chroma
=
p_sys
->
b_text
?
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
:
#ifdef HAVE_FFMPEG_SWSCALE_H
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
);
#else
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'A'
);
#endif
fmt
.
i_aspect
=
p_sys
->
b_text
?
0
:
VOUT_ASPECT_FACTOR
;
fmt
.
i_sar_num
=
fmt
.
i_sar_den
=
1
;
fmt
.
i_width
=
fmt
.
i_visible_width
=
p_page
.
columns
*
12
;
fmt
.
i_height
=
fmt
.
i_visible_height
=
p_page
.
rows
*
10
;
...
...
@@ -296,87 +333,118 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
msg_Err
(
p_dec
,
"cannot allocate SPU region"
);
goto
error
;
}
p_spu
->
p_region
->
i_x
=
0
;
p_spu
->
p_region
->
i_y
=
0
;
p_spu
->
p_region
->
i_align
=
SUBPICTURE_ALIGN_
TOP
;
p_spu
->
p_region
->
i_align
=
SUBPICTURE_ALIGN_
BOTTOM
;
/* Normal text subs, easy markup */
p_spu
->
i_flags
=
p_sys
->
i_align
;
p_spu
->
i_flags
=
SUBPICTURE_ALIGN_BOTTOM
;
p_spu
->
i_start
=
(
mtime_t
)
p_block
->
i_
p
ts
;
p_spu
->
i_start
=
(
mtime_t
)
p_block
->
i_
d
ts
;
p_spu
->
i_stop
=
(
mtime_t
)
0
;
p_spu
->
b_ephemer
=
VLC_TRUE
;
p_spu
->
b_absolute
=
VLC_FALSE
;
p_spu
->
b_pausable
=
VLC_TRUE
;
p_spu
->
i_width
=
fmt
.
i_width
;
p_spu
->
i_height
=
fmt
.
i_height
;
p_spu
->
i_original_picture_width
=
p_page
.
columns
*
12
;
p_spu
->
i_original_picture_height
=
p_page
.
rows
*
10
;
#ifdef WORDS_BIGENDIAN
# define ZVBI_PIXFMT_RGBA32 VBI_PIXFMT_RGBA32_BE
#else
# define ZVBI_PIXFMT_RGBA32 VBI_PIXFMT_RGBA32_LE
#endif
if
(
p_sys
->
b_text
)
{
/* Separate subs and print as ASCII */
int
i_total
;
unsigned
int
i_textsize
=
7000
;
int
i_total
;
char
p_text
[
7000
];
// "ISO-8859-1"
i_total
=
vbi_print_page_region
(
&
p_page
,
p_text
,
i_textsize
,
"UTF-8"
,
0
,
0
,
0
,
0
,
p_page
.
columns
,
p_page
.
rows
);
"UTF-8"
,
0
,
0
,
0
,
0
,
p_page
.
columns
,
p_page
.
rows
);
p_text
[
i_total
]
=
'\0'
;
/* Strip off the pagenumber */
if
(
i_total
<=
8
)
goto
error
;
if
(
i_total
<=
40
)
goto
error
;
p_spu
->
p_region
->
psz_text
=
strdup
(
&
p_text
[
8
]
);
p_spu
->
p_region
->
fmt
.
i_height
=
p_spu
->
p_region
->
fmt
.
i_visible_height
=
p_page
.
rows
+
1
;
msg_Dbg
(
p_dec
,
"page %x-%x
\n
%s"
,
p_page
.
pgno
,
p_page
.
subno
,
p_text
);
msg_Dbg
(
p_dec
,
"page %x-%x
(%d)
\n
%s"
,
p_page
.
pgno
,
p_page
.
subno
,
i_total
,
p_text
);
}
else
{
vbi_draw_vt_page
(
&
p_page
,
VBI_PIXFMT_RGBA32_LE
,
p_spu
->
p_region
->
picture
.
p
->
p_pixels
,
1
,
1
);
p_spu
->
p_region
->
picture
.
p
->
i_lines
=
p_page
.
rows
*
10
;
p_spu
->
p_region
->
picture
.
p
->
i_pitch
=
p_page
.
columns
*
12
*
4
;
}
#ifdef HAVE_FFMPEG_SWSCALE_H
video_format_t
fmt_in
;
picture_t
*
p_pic
,
*
p_dest
;
/* Kludge since zvbi doesn't provide an option to specify opacity. */
if
(
p_sys
->
b_opaque
&&
!
p_sys
->
b_text
)
{
p_begin
=
(
uint32_t
*
)
p_spu
->
p_region
->
picture
.
p
->
p_pixels
;
p_end
=
(
uint32_t
*
)
p_spu
->
p_region
->
picture
.
p
->
p_pixels
+
(
fmt
.
i_width
*
fmt
.
i_height
);
p_pic
=
(
picture_t
*
)
malloc
(
sizeof
(
picture_t
)
);
if
(
!
p_pic
)
{
msg_Err
(
p_dec
,
"out of memory"
);
goto
error
;
}
memset
(
&
fmt_in
,
0
,
sizeof
(
video_format_t
)
);
memset
(
p_pic
,
0
,
sizeof
(
picture_t
)
);
for
(
;
p_begin
<
p_end
;
p_begin
++
)
fmt_in
=
fmt
;
fmt_in
.
i_chroma
=
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'A'
);
vout_AllocatePicture
(
VLC_OBJECT
(
p_dec
),
p_pic
,
fmt_in
.
i_chroma
,
fmt_in
.
i_width
,
fmt_in
.
i_height
,
fmt_in
.
i_aspect
);
if
(
!
p_pic
->
i_planes
)
{
free
(
p_pic
->
p_data_orig
);
free
(
p_pic
);
goto
error
;
}
vbi_draw_vt_page
(
&
p_page
,
ZVBI_PIXFMT_RGBA32
,
p_pic
->
p
->
p_pixels
,
1
,
1
);
p_pic
->
p
->
i_lines
=
p_page
.
rows
*
10
;
p_pic
->
p
->
i_pitch
=
p_page
.
columns
*
12
*
4
;
#if 0
msg_Dbg( p_dec, "page %x-%x(%d,%d)",
p_page.pgno, p_page.subno,
p_page.rows, p_page.columns );
#endif
p_dest
=
image_Convert
(
p_sys
->
p_image
,
p_pic
,
&
fmt_in
,
&
p_spu
->
p_region
->
fmt
);
if
(
!
p_dest
)
{
opacity
=
p_page
.
text
[
y
/
10
*
p_page
.
columns
+
x
/
12
].
opacity
;
switch
(
opacity
)
{
/* Show video instead of this character */
case
VBI_TRANSPARENT_SPACE
:
*
p_begin
=
0
;
break
;
/* To make the boxed text "closed captioning" transparent
* change VLC_TRUE to VLC_FALSE.
*/
case
VBI_OPAQUE
:
if
(
p_sys
->
b_opaque
)
break
;
/* Full text transparency. only foreground color is show */
case
VBI_TRANSPARENT_FULL
:
/* Transparency for boxed text */
case
VBI_SEMI_TRANSPARENT
:
if
(
(
*
p_begin
&
0xffffff00
)
==
0xff
)
*
p_begin
=
0
;
break
;
default:
break
;
}
x
++
;
if
(
x
>=
fmt
.
i_width
)
{
x
=
0
;
y
++
;
}
free
(
p_pic
->
p_data_orig
);
free
(
p_pic
);
msg_Err
(
p_dec
,
"chroma conversion failed"
);
goto
error
;
}
OpaquePage
(
p_dec
,
p_page
,
p_spu
->
p_region
->
fmt
,
&
p_dest
);
vout_CopyPicture
(
VLC_OBJECT
(
p_dec
),
&
(
p_spu
->
p_region
->
picture
),
p_dest
);
free
(
p_pic
->
p_data_orig
);
free
(
p_pic
);
free
(
p_dest
->
p_data_orig
);
free
(
p_dest
);
#else
picture_t
*
p_pic
;
vbi_draw_vt_page
(
&
p_page
,
ZVBI_PIXFMT_RGBA32
,
p_spu
->
p_region
->
picture
.
p
->
p_pixels
,
1
,
1
);
p_spu
->
p_region
->
picture
.
p
->
i_lines
=
p_page
.
rows
*
10
;
p_spu
->
p_region
->
picture
.
p
->
i_pitch
=
p_page
.
columns
*
12
*
4
;
p_pic
=
&
(
p_spu
->
p_region
->
picture
);
OpaquePage
(
p_dec
,
p_page
,
fmt
,
&
p_pic
);
#endif
}
/* end of kludge */
#undef PIXFMT_RGBA32
vbi_unref_page
(
&
p_page
);
block_Release
(
p_block
);
...
...
@@ -384,11 +452,12 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
error:
vbi_unref_page
(
&
p_page
);
if
(
p_spu
!=
NULL
)
if
(
p_spu
!=
NULL
)
{
p_dec
->
pf_spu_buffer_del
(
p_dec
,
p_spu
);
p_spu
=
NULL
;
}
block_Release
(
p_block
);
return
NULL
;
}
...
...
@@ -409,8 +478,9 @@ static void event_handler( vbi_event *ev, void *user_data )
if
(
ev
->
ev
.
ttx_page
.
clock_update
)
msg_Dbg
(
p_dec
,
"clock"
);
if
(
ev
->
ev
.
ttx_page
.
header_update
)
/*
if( ev->ev.ttx_page.header_update )
msg_Dbg( p_dec, "header" );
*/
}
else
if
(
ev
->
type
==
VBI_EVENT_CAPTION
)
msg_Dbg
(
p_dec
,
"Caption line: %x"
,
ev
->
ev
.
caption
.
pgno
);
...
...
@@ -422,6 +492,143 @@ static void event_handler( vbi_event *ev, void *user_data )
msg_Dbg
(
p_dec
,
"Program info received"
);
}
static
int
OpaquePage
(
decoder_t
*
p_dec
,
vbi_page
p_page
,
video_format_t
fmt
,
picture_t
**
p_src
)
{
int
result
=
VLC_EGENERIC
;
/* Kludge since zvbi doesn't provide an option to specify opacity. */
switch
(
fmt
.
i_chroma
)
{
case
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'A'
):
result
=
Opaque_32bpp
(
p_dec
,
p_page
,
fmt
,
p_src
);
break
;
case
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
):
result
=
Opaque_8bpp
(
p_dec
,
p_page
,
fmt
,
p_src
);
break
;
default:
msg_Err
(
p_dec
,
"chroma not supported %4.4s"
,
(
char
*
)
&
fmt
.
i_chroma
);
return
VLC_EGENERIC
;
}
return
result
;
}
static
int
Opaque_32bpp
(
decoder_t
*
p_dec
,
vbi_page
p_page
,
video_format_t
fmt
,
picture_t
**
p_src
)
{
decoder_sys_t
*
p_sys
=
(
decoder_sys_t
*
)
p_dec
->
p_sys
;
uint32_t
*
p_begin
,
*
p_end
;
unsigned
int
x
=
0
,
y
=
0
;
vbi_opacity
opacity
;
/* Kludge since zvbi doesn't provide an option to specify opacity. */
switch
(
fmt
.
i_chroma
)
{
case
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'A'
):
p_begin
=
(
uint32_t
*
)(
*
p_src
)
->
p
->
p_pixels
;
p_end
=
(
uint32_t
*
)(
*
p_src
)
->
p
->
p_pixels
+
(
fmt
.
i_width
*
fmt
.
i_height
);
break
;
default:
msg_Err
(
p_dec
,
"chroma not supported %4.4s"
,
(
char
*
)
&
fmt
.
i_chroma
);
return
VLC_EGENERIC
;
}
for
(
;
p_begin
<
p_end
;
p_begin
++
)
{
opacity
=
p_page
.
text
[
y
/
10
*
p_page
.
columns
+
x
/
12
].
opacity
;
switch
(
opacity
)
{
/* Show video instead of this character */
case
VBI_TRANSPARENT_SPACE
:
*
p_begin
=
0
;
break
;
/* To make the boxed text "closed captioning" transparent
* change VLC_TRUE to VLC_FALSE.
*/
case
VBI_OPAQUE
:
if
(
p_sys
->
b_opaque
)
break
;
/* Full text transparency. only foreground color is show */
case
VBI_TRANSPARENT_FULL
:
*
p_begin
=
0
;
break
;
/* Transparency for boxed text */
case
VBI_SEMI_TRANSPARENT
:
if
(
(
*
p_begin
&
0xffffff00
)
==
0xff
)
*
p_begin
=
0
;
break
;
}
x
++
;
if
(
x
>=
fmt
.
i_width
)
{
x
=
0
;
y
++
;
}
}
/* end of kludge */
return
VLC_SUCCESS
;
}
static
int
Opaque_8bpp
(
decoder_t
*
p_dec
,
vbi_page
p_page
,
video_format_t
fmt
,
picture_t
**
p_src
)
{
decoder_sys_t
*
p_sys
=
(
decoder_sys_t
*
)
p_dec
->
p_sys
;
uint8_t
*
p_begin
,
*
p_end
;
uint32_t
i_width
=
0
;
unsigned
int
x
=
0
,
y
=
0
;
vbi_opacity
opacity
;
/* Kludge since zvbi doesn't provide an option to specify opacity. */
switch
(
fmt
.
i_chroma
)
{
case
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
):
p_begin
=
(
uint8_t
*
)(
*
p_src
)
->
p
[
A_PLANE
].
p_pixels
;
p_end
=
(
uint8_t
*
)(
*
p_src
)
->
p
[
A_PLANE
].
p_pixels
+
(
fmt
.
i_height
*
(
*
p_src
)
->
p
[
A_PLANE
].
i_pitch
);
i_width
=
(
*
p_src
)
->
p
[
A_PLANE
].
i_pitch
;
break
;
default:
msg_Err
(
p_dec
,
"chroma not supported %4.4s"
,
(
char
*
)
&
fmt
.
i_chroma
);
return
VLC_EGENERIC
;
}
for
(
;
p_begin
<
p_end
;
p_begin
++
)
{
opacity
=
p_page
.
text
[
y
/
10
*
p_page
.
columns
+
x
/
12
].
opacity
;
switch
(
opacity
)
{
/* Show video instead of this character */
case
VBI_TRANSPARENT_SPACE
:
*
p_begin
=
0
;
break
;
/* To make the boxed text "closed captioning" transparent
* change VLC_TRUE to VLC_FALSE.
*/
case
VBI_OPAQUE
:
if
(
p_sys
->
b_opaque
)
break
;
/* Full text transparency. only foreground color is show */
case
VBI_TRANSPARENT_FULL
:
*
p_begin
=
0
;
break
;
/* Transparency for boxed text */
case
VBI_SEMI_TRANSPARENT
:
if
(
(
*
p_begin
&
0xffffff00
)
==
0xff
)
*
p_begin
=
0
;
break
;
}
x
++
;
if
(
x
>=
i_width
)
{
x
=
0
;
y
++
;
}
}
/* end of kludge */
return
VLC_SUCCESS
;
}
static
int
RequestPage
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
{
...
...
@@ -444,7 +651,7 @@ static int Opaque( vlc_object_t *p_this, char const *psz_cmd,
}
static
int
Position
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
{
decoder_sys_t
*
p_sys
=
p_data
;
...
...
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