[vlc-devel] commit: Modified the way DDS (display definition segment - HD res dvb subs) is handled and added comments/explanation. (Simon Hailes )
git version control
git at videolan.org
Mon Sep 28 09:57:30 CEST 2009
vlc | branch: master | Simon Hailes <simon at screen.subtitling.com> | Mon Sep 28 09:53:55 2009 +0200| [91b3be07653bbfef1ac666436bf4f134ebcc1b2e] | committer: Jean-Baptiste Kempf
Modified the way DDS (display definition segment - HD res dvb subs) is handled and added comments/explanation.
Applied by jb
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=91b3be07653bbfef1ac666436bf4f134ebcc1b2e
---
modules/codec/dvbsub.c | 78 +++++++++++++++++++++++++++++++++++++++--------
1 files changed, 64 insertions(+), 14 deletions(-)
diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c
index 8b15708..ee15d26 100644
--- a/modules/codec/dvbsub.c
+++ b/modules/codec/dvbsub.c
@@ -38,7 +38,28 @@
* refers to the character index in the codepage belonging to the language specified
* in the subtitle descriptor. Potentially it's designed for widechar
* (but not for UTF-*) codepages.
- *****************************************************************************/
+ *****************************************************************************
+ * Notes on DDS (Display Definition Segment)
+ * DDS (Display Definition Segment) tells the decoder how the subtitle image relates to
+ * the video image.
+ * For SD, the subtitle image is always considered to be for display at 720x576
+ * (although it's assumed that for NTSC, this is 720x480, this is not documented well)
+ * Also, for SD, the subtitle image is drawn 'on the glass' (i.e. after video scaling,
+ + * letterbox, etc.)
+ * For 'HD' (subs marked type 0x14/0x24 in PSI), a DDS must be present, and the subs area
+ * is drawn onto the video area (scales if necessary). The DDS tells the decoder what
+ * resolution the subtitle images were intended for, and hence how to scale the subtitle
+ * images for a particular video size
+ * i.e. if HD video is presented as letterbox, the subs will
+ * be in the same place on the video as if the video was presented on an HD set
+ * indeed, if the HD video was pillarboxed by the decoder, the subs may be cut off as
+ * well as the video. The intent here is that the subs can be placed accurately on the video
+ * - somthing which was missed in the original spec.
+ *
+ * A DDS may also specify a window - this is where the subs images are moved so that the (0,0)
+ * origin of decode is offset.
+ ********************************************************************************************/
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -151,6 +172,7 @@ typedef struct dvbsub_display_s
int i_height;
bool b_windowed;
+ /* these values are only relevant if windowed */
int i_x;
int i_y;
int i_max_x;
@@ -997,11 +1019,20 @@ static void decode_display_definition( decoder_t *p_dec, bs_t *s )
p_sys->display.i_max_y = bs_read( s, 16 );
i_processed_length += 64;
}
+ else
+ {
+ /* if not windowed, setup the window variables to good defaults */
+ /* not necessary, but to avoid future confusion.. */
+ p_sys->display.i_x = 0;
+ p_sys->display.i_max_x = p_sys->display.i_width-1;
+ p_sys->display.i_y = 0;
+ p_sys->display.i_max_y = p_sys->display.i_height-1;
+ }
if( i_processed_length != i_segment_length*8 )
{
- msg_Err( p_dec, "processed length %d != segment length %d",
- i_processed_length, i_segment_length );
+ msg_Err( p_dec, "processed length %d bytes != segment length %d bytes",
+ i_processed_length / 8 , i_segment_length );
}
#ifdef DEBUG_DVBSUB
@@ -1474,9 +1505,14 @@ static subpicture_t *render( decoder_t *p_dec )
if( p_sys->display.b_windowed )
{
- /* TODO: check that this actually works */
- p_spu->i_original_picture_width = p_sys->display.i_max_x - p_sys->display.i_x;
- p_spu->i_original_picture_height = p_sys->display.i_max_y - p_sys->display.i_y;
+ /* From en_300743v01 - */
+ /* the DDS is there to indicate intended size/position of text */
+ /* the intended video area is ->i_width/height */
+ /* the window is within this... SO... we should leave i_original_picture_width etc. as is */
+ /* and ONLY change i_base_x. effectively i_max_x/y are only there to limit memory requirements*/
+ /* we COULD use the upper limits to limit rendering to within these? */
+
+ /* see notes on DDS at the top of the file */
i_base_x += p_sys->display.i_x;
i_base_y += p_sys->display.i_y;
}
@@ -1505,11 +1541,6 @@ static subpicture_t *render( decoder_t *p_dec )
p_regiondef = &p_sys->p_page->p_region_defs[i];
-#ifdef DEBUG_DVBSUB
- msg_Dbg( p_dec, "rendering region %i (%i,%i)", i,
- p_regiondef->i_x, p_regiondef->i_y );
-#endif
-
/* Find associated region */
for( p_region = p_sys->p_regions; p_region != NULL;
p_region = p_region->p_next )
@@ -1517,6 +1548,22 @@ static subpicture_t *render( decoder_t *p_dec )
if( p_regiondef->i_id == p_region->i_id ) break;
}
+#ifdef DEBUG_DVBSUB
+ /* if a region exists, then print it's size */
+ if (p_region)
+ {
+ msg_Dbg( p_dec, "rendering region %i (%i,%i) to (%i,%i)", i,
+ p_regiondef->i_x, p_regiondef->i_y,
+ p_regiondef->i_x + p_region->i_width,
+ p_regiondef->i_y + p_region->i_height );
+ }
+ else
+ {
+ msg_Dbg( p_dec, "rendering region %i (%i,%i) (no region matched to render)", i,
+ p_regiondef->i_x, p_regiondef->i_y );
+ }
+#endif
+
if( !p_region )
{
msg_Dbg( p_dec, "region %i not found", p_regiondef->i_id );
@@ -1716,7 +1763,8 @@ static subpicture_t *YuvaYuvp( subpicture_t *p_subpic )
+ p_region->p_picture->p[0].i_pitch * 1 / 3;
int i_tolerance = 0;
-#ifdef DEBUG_DVBSUB
+#ifdef DEBUG_DVBSUB1
+ /* p_enc not valid here */
msg_Dbg( p_enc, "YuvaYuvp: i_pixels=%d, i_iterator=%d", i_pixels, i_iterator );
#endif
p_fmt->i_chroma = VLC_CODEC_YUVP;
@@ -1793,7 +1841,8 @@ static subpicture_t *YuvaYuvp( subpicture_t *p_subpic )
}
}
-#ifdef DEBUG_DVBSUB
+#ifdef DEBUG_DVBSUB1
+ /* p_enc not valid here */
msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries );
#endif
@@ -1887,7 +1936,8 @@ static subpicture_t *YuvaYuvp( subpicture_t *p_subpic )
p_fmt->p_palette->palette[i][3] = 0;
}
p_fmt->p_palette->i_entries = i_max_entries;
-#ifdef DEBUG_DVBSUB
+#ifdef DEBUG_DVBSUB1
+ /* p_enc not valid here */
msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries );
#endif
}
More information about the vlc-devel
mailing list