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
aac6528e
Commit
aac6528e
authored
Jan 21, 2004
by
Rocky Bernstein
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some of RV32 bugs worked out - pretty close. Some RGB2 work.
Render->Blend
parent
50b9bf83
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
167 additions
and
129 deletions
+167
-129
modules/codec/ogt/cvd_parse.c
modules/codec/ogt/cvd_parse.c
+2
-2
modules/codec/ogt/ogt_parse.c
modules/codec/ogt/ogt_parse.c
+2
-2
modules/codec/ogt/render.c
modules/codec/ogt/render.c
+157
-119
modules/codec/ogt/render.h
modules/codec/ogt/render.h
+2
-2
modules/codec/ogt/subtitle.h
modules/codec/ogt/subtitle.h
+4
-4
No files found.
modules/codec/ogt/cvd_parse.c
View file @
aac6528e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* parse.c: Philips OGT (SVCD subtitle) packet parser
* parse.c: Philips OGT (SVCD subtitle) packet parser
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003, 2004 VideoLAN
* Copyright (C) 2003, 2004 VideoLAN
* $Id: cvd_parse.c,v 1.1
2 2004/01/16 13:32:3
7 rocky Exp $
* $Id: cvd_parse.c,v 1.1
3 2004/01/21 04:45:4
7 rocky Exp $
*
*
* Authors: Rocky Bernstein
* Authors: Rocky Bernstein
* based on code from:
* based on code from:
...
@@ -308,7 +308,7 @@ E_(ParsePacket)( decoder_t *p_dec)
...
@@ -308,7 +308,7 @@ E_(ParsePacket)( decoder_t *p_dec)
/* Fill the p_spu structure */
/* Fill the p_spu structure */
vlc_mutex_init
(
p_dec
,
&
p_spu
->
p_sys
->
lock
);
vlc_mutex_init
(
p_dec
,
&
p_spu
->
p_sys
->
lock
);
p_spu
->
pf_render
=
VCDSub
Render
;
p_spu
->
pf_render
=
VCDSub
Blend
;
p_spu
->
pf_destroy
=
VCDSubDestroySPU
;
p_spu
->
pf_destroy
=
VCDSubDestroySPU
;
p_spu
->
p_sys
->
p_data
=
(
uint8_t
*
)
p_spu
->
p_sys
+
sizeof
(
subpicture_sys_t
);
p_spu
->
p_sys
->
p_data
=
(
uint8_t
*
)
p_spu
->
p_sys
+
sizeof
(
subpicture_sys_t
);
...
...
modules/codec/ogt/ogt_parse.c
View file @
aac6528e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* Philips OGT (SVCD subtitle) packet parser
* Philips OGT (SVCD subtitle) packet parser
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003, 2004 VideoLAN
* Copyright (C) 2003, 2004 VideoLAN
* $Id: ogt_parse.c,v 1.1
0 2004/01/16 13:32:3
7 rocky Exp $
* $Id: ogt_parse.c,v 1.1
1 2004/01/21 04:45:4
7 rocky Exp $
*
*
* Author: Rocky Bernstein
* Author: Rocky Bernstein
* based on code from:
* based on code from:
...
@@ -181,7 +181,7 @@ E_(ParsePacket)( decoder_t *p_dec)
...
@@ -181,7 +181,7 @@ E_(ParsePacket)( decoder_t *p_dec)
/* Fill the p_spu structure */
/* Fill the p_spu structure */
vlc_mutex_init
(
p_dec
,
&
p_spu
->
p_sys
->
lock
);
vlc_mutex_init
(
p_dec
,
&
p_spu
->
p_sys
->
lock
);
p_spu
->
pf_render
=
VCDSub
Render
;
p_spu
->
pf_render
=
VCDSub
Blend
;
p_spu
->
pf_destroy
=
VCDSubDestroySPU
;
p_spu
->
pf_destroy
=
VCDSubDestroySPU
;
p_spu
->
p_sys
->
p_data
=
(
uint8_t
*
)
p_spu
->
p_sys
+
sizeof
(
subpicture_sys_t
);
p_spu
->
p_sys
->
p_data
=
(
uint8_t
*
)
p_spu
->
p_sys
+
sizeof
(
subpicture_sys_t
);
...
...
modules/codec/ogt/render.c
View file @
aac6528e
/*****************************************************************************
/*****************************************************************************
* render.c : Philips OGT and CVD (VCD Subtitle)
renderer
* render.c : Philips OGT and CVD (VCD Subtitle)
blending routines
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003, 2004 VideoLAN
* Copyright (C) 2003, 2004 VideoLAN
* $Id: render.c,v 1.1
6 2004/01/20 13:31:15
rocky Exp $
* $Id: render.c,v 1.1
7 2004/01/21 04:45:47
rocky Exp $
*
*
* Author: Rocky Bernstein
* Author: Rocky Bernstein
* based on code from:
* based on code from:
...
@@ -44,35 +44,40 @@
...
@@ -44,35 +44,40 @@
#define MAX_ALPHA ((1<<ALPHA_BITS) - 1)
#define MAX_ALPHA ((1<<ALPHA_BITS) - 1)
#define ALPHA_SCALEDOWN (8-ALPHA_BITS)
#define ALPHA_SCALEDOWN (8-ALPHA_BITS)
/* We use a somewhat artifical factor in scaling calculations so
that we can use integer arithmetic and still get somewhat precise
results.
*/
#define ASCALE 6
/* Horrible hack to get dbg_print to do the right thing */
/* Horrible hack to get dbg_print to do the right thing */
#define p_dec p_vout
#define p_dec p_vout
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
*****************************************************************************/
*****************************************************************************/
static
void
Render
I420
(
vout_thread_t
*
,
picture_t
*
,
const
subpicture_t
*
,
static
void
Blend
I420
(
vout_thread_t
*
,
picture_t
*
,
const
subpicture_t
*
,
vlc_bool_t
);
vlc_bool_t
);
static
void
Render
YUY2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
static
void
Blend
YUY2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
static
void
Render
RV16
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
static
void
Blend
RV16
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
static
void
Render
RV32
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
static
void
Blend
RV32
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
static
void
Render
RGB2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
static
void
Blend
RGB2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
);
/*****************************************************************************
/*****************************************************************************
*
RenderSPU: draw an SPU on
a picture
*
BlendSPU: blend a subtitle into
a picture
*****************************************************************************
*****************************************************************************
This is a fast implementation of the subpicture drawing code. The
This blends subtitles (a subpicture) into the underlying
data has been preprocessed. Each byte has a run-length 1 in the upper
picture. Subtitle data has been preprocessed as YUV + transparancy
nibble and a color in the lower nibble. The interleaving of rows has
or 4 bytes per pixel with interleaving of rows in the subtitle
been done. Most sanity checks are already done so that this
removed.
routine can be as fast as possible.
*****************************************************************************/
*****************************************************************************/
void
VCDSub
Render
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
void
VCDSub
Blend
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
)
const
subpicture_t
*
p_spu
)
{
{
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
...
@@ -86,23 +91,23 @@ void VCDSubRender( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -86,23 +91,23 @@ void VCDSubRender( vout_thread_t *p_vout, picture_t *p_pic,
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
case
VLC_FOURCC
(
'I'
,
'Y'
,
'U'
,
'V'
):
case
VLC_FOURCC
(
'I'
,
'Y'
,
'U'
,
'V'
):
case
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
):
case
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
):
Render
I420
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
Blend
I420
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
break
;
break
;
/* RGB 555 - scaled */
/* RGB 555 - scaled */
case
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
):
Render
RV16
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
Blend
RV16
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
break
;
break
;
/* RV32 target, scaling */
/* RV32 target, scaling */
case
VLC_FOURCC
(
'R'
,
'V'
,
'2'
,
'4'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'2'
,
'4'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
):
Render
RV32
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
Blend
RV32
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
break
;
break
;
/* NVidia overlay, no scaling */
/* NVidia overlay, no scaling */
case
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
):
case
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
):
Render
YUY2
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
Blend
YUY2
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
break
;
break
;
/* Palettized 8 bits per pixel (256 colors). Each
/* Palettized 8 bits per pixel (256 colors). Each
...
@@ -110,7 +115,7 @@ void VCDSubRender( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -110,7 +115,7 @@ void VCDSubRender( vout_thread_t *p_vout, picture_t *p_pic,
Used in ASCII Art.
Used in ASCII Art.
*/
*/
case
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'2'
):
case
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'2'
):
Render
RGB2
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
Blend
RGB2
(
p_vout
,
p_pic
,
p_spu
,
p_spu
->
p_sys
->
b_crop
);
/*msg_Err( p_vout, "RGB2 not implemented yet" );*/
/*msg_Err( p_vout, "RGB2 not implemented yet" );*/
break
;
break
;
...
@@ -133,7 +138,7 @@ void VCDSubRender( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -133,7 +138,7 @@ void VCDSubRender( vout_thread_t *p_vout, picture_t *p_pic,
all Cb (=V) samples in a similar fashion.
all Cb (=V) samples in a similar fashion.
*/
*/
static
void
Render
I420
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
static
void
Blend
I420
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
{
{
/* Common variables */
/* Common variables */
...
@@ -317,7 +322,7 @@ static void RenderI420( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -317,7 +322,7 @@ static void RenderI420( vout_thread_t *p_vout, picture_t *p_pic,
*/
*/
#define BYTES_PER_PIXEL 4
#define BYTES_PER_PIXEL 4
static
void
Render
YUY2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
static
void
Blend
YUY2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
{
{
/* Common variables */
/* Common variables */
...
@@ -571,7 +576,7 @@ yuv2rgb555(ogt_yuvt_t *p_yuv, uint8_t *p_rgb1, uint8_t *p_rgb2 )
...
@@ -571,7 +576,7 @@ yuv2rgb555(ogt_yuvt_t *p_yuv, uint8_t *p_rgb1, uint8_t *p_rgb2 )
#define BYTES_PER_PIXEL 2
#define BYTES_PER_PIXEL 2
static
void
static
void
Render
RV16
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
Blend
RV16
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
{
{
/* Common variables */
/* Common variables */
...
@@ -591,8 +596,8 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -591,8 +596,8 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
i_xscale
=
(
p_vout
->
output
.
i_width
<<
6
)
/
p_vout
->
render
.
i_width
;
i_xscale
=
(
p_vout
->
output
.
i_width
<<
ASCALE
)
/
p_vout
->
render
.
i_width
;
i_yscale
=
(
p_vout
->
output
.
i_height
<<
6
)
/
p_vout
->
render
.
i_height
;
i_yscale
=
(
p_vout
->
output
.
i_height
<<
ASCALE
)
/
p_vout
->
render
.
i_height
;
dbg_print
(
(
DECODE_DBG_CALL
|
DECODE_DBG_RENDER
),
dbg_print
(
(
DECODE_DBG_CALL
|
DECODE_DBG_RENDER
),
"spu: %dx%d, scaled: %dx%d, vout render: %dx%d, scale %dx%d"
,
"spu: %dx%d, scaled: %dx%d, vout render: %dx%d, scale %dx%d"
,
...
@@ -609,8 +614,8 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -609,8 +614,8 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
the picture coordinates subtitle offsets
the picture coordinates subtitle offsets
*/
*/
p_pixel_base
=
p_pic
->
p
->
p_pixels
p_pixel_base
=
p_pic
->
p
->
p_pixels
+
(
(
p_spu
->
i_x
*
i_xscale
)
>>
6
)
*
BYTES_PER_PIXEL
+
(
(
p_spu
->
i_x
*
i_xscale
)
>>
ASCALE
)
*
BYTES_PER_PIXEL
+
(
(
p_spu
->
i_y
*
i_yscale
)
>>
6
)
*
p_pic
->
p
->
i_pitch
;
+
(
(
p_spu
->
i_y
*
i_yscale
)
>>
ASCALE
)
*
p_pic
->
p
->
i_pitch
;
i_x_start
=
p_sys
->
i_x_start
;
i_x_start
=
p_sys
->
i_x_start
;
i_y_start
=
i_yscale
*
p_sys
->
i_y_start
;
i_y_start
=
i_yscale
*
p_sys
->
i_y_start
;
...
@@ -625,7 +630,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -625,7 +630,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
i_y_src
+=
p_spu
->
i_width
)
i_y_src
+=
p_spu
->
i_width
)
{
{
uint8_t
*
p_pixel_base_y
;
uint8_t
*
p_pixel_base_y
;
i_ytmp
=
i_y
>>
6
;
i_ytmp
=
i_y
>>
ASCALE
;
i_y
+=
i_yscale
;
i_y
+=
i_yscale
;
p_pixel_base_y
=
p_pixel_base
+
(
i_ytmp
*
p_pic
->
p
->
i_pitch
);
p_pixel_base_y
=
p_pixel_base
+
(
i_ytmp
*
p_pic
->
p
->
i_pitch
);
i_x
=
0
;
i_x
=
0
;
...
@@ -639,7 +644,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -639,7 +644,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
}
}
/* Check whether we need to draw one line or more than one */
/* Check whether we need to draw one line or more than one */
if
(
i_ytmp
+
1
>=
(
i_y
>>
6
)
)
if
(
i_ytmp
+
1
>=
(
i_y
>>
ASCALE
)
)
{
{
/* Draw until we reach the end of the line */
/* Draw until we reach the end of the line */
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
...
@@ -717,7 +722,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -717,7 +722,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
}
}
else
else
{
{
i_ynext
=
p_pic
->
p
->
i_pitch
*
i_y
>>
6
;
i_ynext
=
p_pic
->
p
->
i_pitch
*
i_y
>>
ASCALE
;
/* Draw until we reach the end of the line */
/* Draw until we reach the end of the line */
...
@@ -806,7 +811,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -806,7 +811,7 @@ RenderRV16( vout_thread_t *p_vout, picture_t *p_pic,
#define BYTES_PER_PIXEL 4
#define BYTES_PER_PIXEL 4
static
void
static
void
Render
RV32
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
Blend
RV32
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
{
{
/* Common variables */
/* Common variables */
...
@@ -826,8 +831,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -826,8 +831,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
i_xscale
=
(
p_vout
->
output
.
i_width
<<
6
)
/
p_vout
->
render
.
i_width
;
i_xscale
=
(
p_vout
->
output
.
i_width
<<
ASCALE
)
/
p_vout
->
render
.
i_width
;
i_yscale
=
(
p_vout
->
output
.
i_height
<<
6
)
/
p_vout
->
render
.
i_height
;
i_yscale
=
(
p_vout
->
output
.
i_height
<<
ASCALE
)
/
p_vout
->
render
.
i_height
;
dbg_print
(
(
DECODE_DBG_CALL
|
DECODE_DBG_RENDER
),
dbg_print
(
(
DECODE_DBG_CALL
|
DECODE_DBG_RENDER
),
"spu: %dx%d, scaled: %dx%d, vout render: %dx%d, scale %dx%d"
,
"spu: %dx%d, scaled: %dx%d, vout render: %dx%d, scale %dx%d"
,
...
@@ -844,8 +849,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -844,8 +849,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
the picture coordinates subtitle offsets
the picture coordinates subtitle offsets
*/
*/
p_pixel_base
=
p_pic
->
p
->
p_pixels
p_pixel_base
=
p_pic
->
p
->
p_pixels
+
(
(
p_spu
->
i_x
*
i_xscale
)
>>
6
)
*
BYTES_PER_PIXEL
+
(
(
p_spu
->
i_x
*
i_xscale
)
>>
ASCALE
)
*
BYTES_PER_PIXEL
+
(
(
p_spu
->
i_y
*
i_yscale
)
>>
6
)
*
p_pic
->
p
->
i_pitch
;
+
(
(
p_spu
->
i_y
*
i_yscale
)
>>
ASCALE
)
*
p_pic
->
p
->
i_pitch
;
i_x_start
=
p_sys
->
i_x_start
;
i_x_start
=
p_sys
->
i_x_start
;
i_y_start
=
i_yscale
*
p_sys
->
i_y_start
;
i_y_start
=
i_yscale
*
p_sys
->
i_y_start
;
...
@@ -860,7 +865,7 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -860,7 +865,7 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
i_y_src
+=
p_spu
->
i_width
)
i_y_src
+=
p_spu
->
i_width
)
{
{
uint8_t
*
p_pixel_base_y
;
uint8_t
*
p_pixel_base_y
;
i_ytmp
=
i_y
>>
6
;
i_ytmp
=
i_y
>>
ASCALE
;
i_y
+=
i_yscale
;
i_y
+=
i_yscale
;
p_pixel_base_y
=
p_pixel_base
+
(
i_ytmp
*
p_pic
->
p
->
i_pitch
);
p_pixel_base_y
=
p_pixel_base
+
(
i_ytmp
*
p_pic
->
p
->
i_pitch
);
i_x
=
0
;
i_x
=
0
;
...
@@ -874,7 +879,7 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -874,7 +879,7 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
}
}
/* Check whether we need to draw one line or more than one */
/* Check whether we need to draw one line or more than one */
if
(
i_ytmp
+
1
>=
(
i_y
>>
6
)
)
if
(
i_ytmp
+
1
>=
(
i_y
>>
ASCALE
)
)
{
{
/* Draw until we reach the end of the line */
/* Draw until we reach the end of the line */
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
...
@@ -919,7 +924,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -919,7 +924,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
/* This is the location that's going to get changed.
/* This is the location that's going to get changed.
*/
*/
uint8_t
*
p_dest
=
p_pixel_base_y
+
i_x
*
BYTES_PER_PIXEL
;
uint8_t
*
p_dest
=
p_pixel_base_y
+
((
i_x
*
i_xscale
)
>>
ASCALE
)
*
BYTES_PER_PIXEL
;
uint8_t
rgb
[
4
];
uint8_t
rgb
[
4
];
yuv2rgb
(
p_source
,
rgb
);
yuv2rgb
(
p_source
,
rgb
);
...
@@ -939,7 +945,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -939,7 +945,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
be completely transparent and is not correct, but
be completely transparent and is not correct, but
that's handled in a special case above anyway. */
that's handled in a special case above anyway. */
uint8_t
*
p_dest
=
p_pixel_base_y
+
i_x
*
BYTES_PER_PIXEL
;
uint8_t
*
p_dest
=
p_pixel_base_y
+
((
i_x
*
i_xscale
)
>>
ASCALE
)
*
BYTES_PER_PIXEL
;
uint8_t
i_destalpha
=
MAX_ALPHA
-
p_source
->
s
.
t
;
uint8_t
i_destalpha
=
MAX_ALPHA
-
p_source
->
s
.
t
;
uint8_t
rgb
[
3
];
uint8_t
rgb
[
3
];
...
@@ -953,7 +960,7 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -953,7 +960,7 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
}
}
else
else
{
{
i_ynext
=
p_pic
->
p
->
i_pitch
*
i_y
>>
6
;
i_ynext
=
p_pic
->
p
->
i_pitch
*
i_y
>>
ASCALE
;
/* Draw until we reach the end of the line */
/* Draw until we reach the end of the line */
...
@@ -993,8 +1000,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -993,8 +1000,8 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
/* This is the location that's going to get changed.
/* This is the location that's going to get changed.
*/
*/
uint8_t
*
p_pixel_base_x
=
p_pixel_base
uint8_t
*
p_pixel_base_x
=
p_pixel_base
+
i_x
*
BYTES_PER_PIXEL
;
+
((
i_x
*
i_xscale
)
>>
ASCALE
)
*
BYTES_PER_PIXEL
;
uint8_t
rgb
[
4
];
uint8_t
rgb
[
4
];
yuv2rgb
(
p_source
,
rgb
);
yuv2rgb
(
p_source
,
rgb
);
...
@@ -1041,14 +1048,14 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -1041,14 +1048,14 @@ RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
#define BYTES_PER_PIXEL 1
#define BYTES_PER_PIXEL 1
static
void
static
void
Render
RGB2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
Blend
RGB2
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
,
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
const
subpicture_t
*
p_spu
,
vlc_bool_t
b_crop
)
{
{
/* Common variables */
/* Common variables */
uint8_t
*
p_pixel_base
;
uint8_t
*
p_pixel_base
;
ogt_yuvt_t
*
p_src_start
=
(
ogt_yuvt
_t
*
)
p_spu
->
p_sys
->
p_data
;
uint8_t
*
p_src_start
=
(
uint8
_t
*
)
p_spu
->
p_sys
->
p_data
;
ogt_yuvt
_t
*
p_src_end
=
&
p_src_start
[
p_spu
->
i_height
*
p_spu
->
i_width
];
uint8
_t
*
p_src_end
=
&
p_src_start
[
p_spu
->
i_height
*
p_spu
->
i_width
];
ogt_yuvt
_t
*
p_source
;
uint8
_t
*
p_source
;
int
i_x
,
i_y
;
int
i_x
,
i_y
;
int
i_y_src
;
int
i_y_src
;
...
@@ -1061,8 +1068,8 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -1061,8 +1068,8 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
struct
subpicture_sys_t
*
p_sys
=
p_spu
->
p_sys
;
i_xscale
=
(
p_vout
->
output
.
i_width
<<
6
)
/
p_vout
->
render
.
i_width
;
i_xscale
=
(
p_vout
->
output
.
i_width
<<
ASCALE
)
/
p_vout
->
render
.
i_width
;
i_yscale
=
(
p_vout
->
output
.
i_height
<<
6
)
/
p_vout
->
render
.
i_height
;
i_yscale
=
(
p_vout
->
output
.
i_height
<<
ASCALE
)
/
p_vout
->
render
.
i_height
;
dbg_print
(
(
DECODE_DBG_CALL
|
DECODE_DBG_RENDER
),
dbg_print
(
(
DECODE_DBG_CALL
|
DECODE_DBG_RENDER
),
"spu: %dx%d, scaled: %dx%d, vout render: %dx%d, scale %dx%d"
,
"spu: %dx%d, scaled: %dx%d, vout render: %dx%d, scale %dx%d"
,
...
@@ -1079,15 +1086,15 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -1079,15 +1086,15 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
the picture coordinates subtitle offsets
the picture coordinates subtitle offsets
*/
*/
p_pixel_base
=
p_pic
->
p
->
p_pixels
p_pixel_base
=
p_pic
->
p
->
p_pixels
+
(
(
p_spu
->
i_x
*
i_xscale
)
>>
6
)
*
BYTES_PER_PIXEL
+
(
(
p_spu
->
i_x
*
i_xscale
)
>>
ASCALE
)
*
BYTES_PER_PIXEL
+
(
(
p_spu
->
i_y
*
i_yscale
)
>>
6
)
*
p_pic
->
p
->
i_pitch
;
+
(
(
p_spu
->
i_y
*
i_yscale
)
>>
ASCALE
)
*
p_pic
->
p
->
i_pitch
;
i_x_start
=
p_sys
->
i_x_start
;
i_x_start
=
p_sys
->
i_x_start
;
i_y_start
=
i_yscale
*
p_sys
->
i_y_start
;
i_y_start
=
i_yscale
*
p_sys
->
i_y_start
;
i_x_end
=
p_sys
->
i_x_end
;
i_x_end
=
p_sys
->
i_x_end
;
i_y_end
=
i_yscale
*
p_sys
->
i_y_end
;
i_y_end
=
i_yscale
*
p_sys
->
i_y_end
;
p_source
=
(
ogt_yuvt
_t
*
)
p_sys
->
p_data
;
p_source
=
(
uint8
_t
*
)
p_sys
->
p_data
;
/* Draw until we reach the bottom of the subtitle */
/* Draw until we reach the bottom of the subtitle */
i_y
=
0
;
i_y
=
0
;
...
@@ -1095,11 +1102,31 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -1095,11 +1102,31 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
i_y_src
+=
p_spu
->
i_width
)
i_y_src
+=
p_spu
->
i_width
)
{
{
uint8_t
*
p_pixel_base_y
;
uint8_t
*
p_pixel_base_y
;
i_ytmp
=
i_y
>>
6
;
i_ytmp
=
i_y
>>
ASCALE
;
i_y
+=
i_yscale
;
i_y
+=
i_yscale
;
p_pixel_base_y
=
p_pixel_base
+
(
i_ytmp
*
p_pic
->
p
->
i_pitch
);
p_pixel_base_y
=
p_pixel_base
+
(
i_ytmp
*
p_pic
->
p
->
i_pitch
);
i_x
=
0
;
i_x
=
0
;
#if 0
/* Remove this */
*p_pixel_base_y = 0xff; /*+++++*/
*(p_pixel_base_y+1) = 0x0;
*(p_pixel_base_y+2) = 0x0;
*(p_pixel_base_y+3) = 0x0;
*(p_pixel_base_y+4) = 0x0;
*(p_pixel_base_y+5) = 0x0;
*(p_pixel_base_y+6) = 0x0;
*(p_pixel_base_y+7) = 0x0;
*(p_pixel_base_y+8) = 0xFF;
*(p_pixel_base_y+9) = 0xFF;
*(p_pixel_base_y+10) = 0xFF;
*(p_pixel_base_y+11) = 0xFF;
*(p_pixel_base_y+12) = 0xFF;
*(p_pixel_base_y+13) = 0xFF;
*(p_pixel_base_y+14) = 0xFF;
*(p_pixel_base_y+15) = 0xFF;
#endif
if
(
b_crop
)
{
if
(
b_crop
)
{
if
(
i_y
>
i_y_end
)
break
;
if
(
i_y
>
i_y_end
)
break
;
if
(
i_x_start
)
{
if
(
i_x_start
)
{
...
@@ -1108,79 +1135,90 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
...
@@ -1108,79 +1135,90 @@ RenderRGB2( vout_thread_t *p_vout, picture_t *p_pic,
}
}
}
}
/* Draw until we reach the end of the line */
/* Check whether we need to draw one line or more than one */
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
if
(
i_ytmp
+
1
>=
(
i_y
>>
ASCALE
)
)
{
{
#if 0
/* Draw until we reach the end of the line */
uint8_t *p=(uint8_t *) p_source;
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
printf("+++ %02x %02x %02x %02x\n",
{
p[0], p[1], p[2], p[3]);
if
(
b_crop
)
{
#endif
/* FIXME: y cropping should be dealt with outside of this
if
(
b_crop
)
{
loop.*/
if
(
i_y
<
i_y_start
)
continue
;
if
(
i_x
>
i_x_end
)
{
p_source
+=
p_spu
->
i_width
-
i_x
;
break
;
}
}
/* FIXME: y cropping should be dealt with outside of this
if
(
p_source
>=
p_src_end
)
{
loop.*/
msg_Err
(
p_vout
,
"Trying to access beyond subtitle %dx%d %d"
,
if
(
i_y
<
i_y_start
)
continue
;
i_x
,
i_y
/
i_yscale
,
i_height
);
return
;
}
if
(
*
p_source
==
0
)
{
#if 0
printf(" "); /*++++*/
#endif
}
else
{
uint8_t
*
p_dest
=
p_pixel_base_y
+
((
i_x
*
i_xscale
)
>>
7
);
*
p_dest
++
=
0xff
;
#if 0
printf("%1d", *p_source); /*++++*/
#endif
}
if
(
i_x
>
i_x_end
)
{
p_source
+=
p_spu
->
i_width
-
i_x
;
break
;
}
}
if
(
p_source
>=
p_src_end
)
{
msg_Err
(
p_vout
,
"Trying to access beyond subtitle %dx%d %d"
,
i_x
,
i_y
/
i_yscale
,
i_height
);
return
;
}
}
#if 0
switch
(
p_source
->
s
.
t
)
printf("\n"); /*++++*/
{
#endif
case
0x00
:
}
else
{
/* Completely transparent. Don't change pixel. */
/* Have to scale over many lines. */
break
;
int
i_yreal
=
p_pic
->
p
->
i_pitch
*
i_ytmp
;
int
i_ynext
=
p_pic
->
p
->
i_pitch
*
i_y
>>
ASCALE
;
default:
case
MAX_ALPHA
:
/* Draw until we reach the end of the line */
{
for
(
;
i_x
<
p_spu
->
i_width
;
i_x
++
,
p_source
++
)
/* Completely opaque. Completely overwrite underlying
{
pixel with subtitle pixel. */
if
(
b_crop
)
{
/* This is the location that's going to get changed.
*/
uint8_t
*
p_dest
=
p_pixel_base_y
+
i_x
;
uint8_t
rgb
[
4
];
yuv2rgb
(
p_source
,
rgb
);
*
p_dest
++
=
0xff
;
break
;
}
#ifdef TRANSPARENCY_FINISHED
/* FIXME: y cropping should be dealt with outside of this
default:
loop.*/
{
if
(
i_y
<
i_y_start
)
continue
;
/* Blend in underlying pixel subtitle pixel. */
if
(
i_x
>
i_x_end
)
/* To be able to scale correctly for full opaqueness, we
{
add 1 to the alpha. This means alpha value 0 won't
p_source
+=
p_spu
->
i_width
-
i_x
;
be completely transparent and is not correct, but
break
;
that's handled in a special case above anyway. */
}
}
uint8_t
*
p_dest
=
p_pixel_base_y
+
i_x
*
BYTES_PER_PIXEL
;
uint8_t
i_destalpha
=
MAX_ALPHA
-
p_source
->
s
.
t
;
if
(
p_source
>=
p_src_end
)
{
uint8_t
rgb
[
3
];
msg_Err
(
p_vout
,
"Trying to access beyond subtitle %dx%d %d"
,
i_x
,
i_y
/
i_yscale
,
i_height
);
yuv2rgb
(
p_source
,
rgb
);
return
;
rv32_pack_blend
(
p_dest
,
rgb
,
dest_alpha
,
ALPHA_SCALEDOWN
);
}
break
;
if
(
*
p_source
!=
0
)
{
printf
(
"_"
);
/*++++*/
}
else
{
printf
(
"%1d"
,
*
p_source
);
/*++++*/
for
(
i_ytmp
=
i_yreal
;
i_ytmp
<
i_ynext
;
i_ytmp
+=
p_pic
->
p
->
i_pitch
)
{
uint8_t
*
p_dest
=
p_pixel_base
+
i_ytmp
+
i_x
*
BYTES_PER_PIXEL
;
*
p_dest
++
=
0xff
;
}
}
#endif
/*TRANSPARENCY_FINISHED*/
}
}
}
}
}
}
}
}
}
...
...
modules/codec/ogt/render.h
View file @
aac6528e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* render.h : Common SVCD and CVD rendering routine(s).
* render.h : Common SVCD and CVD rendering routine(s).
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: render.h,v 1.
2 2003/12/28 04:51:52
rocky Exp $
* $Id: render.h,v 1.
3 2004/01/21 04:45:47
rocky Exp $
*
*
* Author: Rocky Bernstein
* Author: Rocky Bernstein
*
*
...
@@ -24,5 +24,5 @@
...
@@ -24,5 +24,5 @@
/*****************************************************************************
/*****************************************************************************
* Prototypes
* Prototypes
*****************************************************************************/
*****************************************************************************/
void
VCDSub
Render
(
vout_thread_t
*
,
picture_t
*
,
const
subpicture_t
*
);
void
VCDSub
Blend
(
vout_thread_t
*
,
picture_t
*
,
const
subpicture_t
*
);
modules/codec/ogt/subtitle.h
View file @
aac6528e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* subtitle.h : Common SVCD and CVD subtitles header
* subtitle.h : Common SVCD and CVD subtitles header
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003,2004 VideoLAN
* Copyright (C) 2003,2004 VideoLAN
* $Id: subtitle.h,v 1.
9 2004/01/16 13:32:3
7 rocky Exp $
* $Id: subtitle.h,v 1.
10 2004/01/21 04:45:4
7 rocky Exp $
*
*
* Author: Rocky Bernstein
* Author: Rocky Bernstein
* based on code from:
* based on code from:
...
@@ -72,15 +72,15 @@
...
@@ -72,15 +72,15 @@
N_("Add this to starting horizontal position of subtitle.")
N_("Add this to starting horizontal position of subtitle.")
#define HORIZONTAL_CORRECT_LONGTEXT N_( \
#define HORIZONTAL_CORRECT_LONGTEXT N_( \
"If you need to adjust the subtitle starting position horizontally, " \
"If you need to adjust the subtitle starting position horizontally, " \
"set this. Negative values
can be used to shift left. 0 would "
\
"set this. Negative values
shift left and postive values right. 0 would "
\
"be no deviation from where the position specified in the subtitle." \
"be no deviation from where the position specified in the subtitle." \
)
)
#define VERTICAL_CORRECT \
#define VERTICAL_CORRECT \
N_("Add this to starting vertical position of subtitle.")
N_("Add this to starting vertical position of subtitle.")
#define VERTICAL_CORRECT_LONGTEXT N_( \
#define VERTICAL_CORRECT_LONGTEXT N_( \
"If you need to adjust the subtitle starting position
horizont
ally, " \
"If you need to adjust the subtitle starting position
vertic
ally, " \
"set this. Negative values
can be used to shift left
. 0 would " \
"set this. Negative values
shift up, positive values down
. 0 would " \
"be no deviation from where the position specified in the subtitle." \
"be no deviation from where the position specified in the subtitle." \
)
)
...
...
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