[vlc-commits] demux: mp4: add support for tx3g (fix #8305)
Francois Cartegnie
git at videolan.org
Tue Mar 25 17:40:20 CET 2014
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Mar 21 19:56:48 2014 +0100| [fd569c883b602a5ae6da3fffed98751fb0fba26f] | committer: Francois Cartegnie
demux: mp4: add support for tx3g (fix #8305)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fd569c883b602a5ae6da3fffed98751fb0fba26f
---
NEWS | 1 +
modules/demux/mp4/libmp4.c | 13 +++++++++-
modules/demux/mp4/libmp4.h | 7 +++++
modules/demux/mp4/mp4.c | 61 ++++++++++++++++++++++----------------------
4 files changed, 51 insertions(+), 31 deletions(-)
diff --git a/NEWS b/NEWS
index cb3ad9e..4fce4e6 100644
--- a/NEWS
+++ b/NEWS
@@ -49,6 +49,7 @@ Demuxer:
* Fix encoding issues in some XML playlist formats
* Support THP Wii/Gamecube, RenderWare and Escape Replay game video files
* New HEVC raw packetizer and demuxer
+ * Handle MOV/MP4 tx3g styled subtitles through codec
Muxers:
* Important rework of the Ogg muxer, notably for skeleton
diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c
index 1357f44..50f77a6 100644
--- a/modules/demux/mp4/libmp4.c
+++ b/modules/demux/mp4/libmp4.c
@@ -1842,7 +1842,7 @@ static int MP4_ReadBox_sample_text( stream_t *p_stream, MP4_Box_t *p_box )
MP4_GET2BYTES( p_box->data.p_sample_text->i_background_color[0] );
MP4_GET2BYTES( p_box->data.p_sample_text->i_background_color[1] );
MP4_GET2BYTES( p_box->data.p_sample_text->i_background_color[2] );
- p_box->data.p_sample_text->i_background_color[3] = 0;
+ p_box->data.p_sample_text->i_background_color[3] = 0xFF;
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_top );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_left );
@@ -1879,6 +1879,13 @@ static int MP4_ReadBox_sample_tx3g( stream_t *p_stream, MP4_Box_t *p_box )
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_bottom );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_right );
+ MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved3 );
+
+ MP4_GET2BYTES( p_box->data.p_sample_text->i_font_id );
+ MP4_GET1BYTE ( p_box->data.p_sample_text->i_font_face );
+ MP4_GET1BYTE ( p_box->data.p_sample_text->i_font_size );
+ MP4_GET4BYTES( p_box->data.p_sample_text->i_font_color );
+
#ifdef MP4_VERBOSE
msg_Dbg( p_stream, "read box: \"tx3g\" in stsd text" );
#endif
@@ -3218,6 +3225,10 @@ static const struct
{ ATOM_free, MP4_ReadBoxSkip, MP4_FreeBox_Common },
{ ATOM_wide, MP4_ReadBoxSkip, MP4_FreeBox_Common },
+ /* Subtitles */
+ { ATOM_tx3g, MP4_ReadBox_sample_tx3g, MP4_FreeBox_Common },
+ //{ ATOM_text, MP4_ReadBox_sample_text, MP4_FreeBox_Common },
+
/* for codecs */
{ ATOM_soun, MP4_ReadBox_sample_soun, MP4_FreeBox_sample_soun },
{ ATOM_ms02, MP4_ReadBox_sample_soun, MP4_FreeBox_sample_soun },
diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h
index c430f22..3f539ec 100644
--- a/modules/demux/mp4/libmp4.h
+++ b/modules/demux/mp4/libmp4.h
@@ -580,6 +580,13 @@ typedef struct
uint16_t i_text_box_bottom;
uint16_t i_text_box_right;
+ uint32_t i_reserved3;
+
+ uint16_t i_font_id;
+ uint8_t i_font_face;
+ uint8_t i_font_size;
+ uint32_t i_font_color; //RGBA
+
// TODO to complete
} MP4_Box_data_sample_text_t;
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 45ee4cd..a4184d5 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -756,36 +756,12 @@ static int Demux( demux_t *p_demux )
MP4_TrackUnselect( p_demux, tk );
break;
}
-
else if( tk->fmt.i_cat == SPU_ES )
{
- if( tk->fmt.i_codec == VLC_CODEC_SUBT &&
- p_block->i_buffer >= 2 )
- {
- size_t i_size = GetWBE( p_block->p_buffer );
-
- if( i_size + 2 <= p_block->i_buffer )
- {
- char *p;
- /* remove the length field, and append a '\0' */
- memmove( &p_block->p_buffer[0],
- &p_block->p_buffer[2], i_size );
- p_block->p_buffer[i_size] = '\0';
- p_block->i_buffer = i_size + 1;
-
- /* convert \r -> \n */
- while( ( p = strchr((char *) p_block->p_buffer, '\r' ) ) )
- {
- *p = '\n';
- }
- }
- else
- {
- /* Invalid */
- p_block->i_buffer = 0;
- }
- }
+ if ( tk->fmt.i_codec != VLC_CODEC_TX3G )
+ p_block->i_buffer = 0;
}
+
/* dts */
p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk );
/* pts */
@@ -1931,7 +1907,31 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
case( VLC_FOURCC( 't', 'e', 'x', 't' ) ):
case( VLC_FOURCC( 't', 'x', '3', 'g' ) ):
- p_track->fmt.i_codec = VLC_CODEC_SUBT;
+ {
+ p_track->fmt.i_codec = VLC_CODEC_TX3G;
+ MP4_Box_data_sample_text_t *p_text = p_sample->data.p_sample_text;
+ if ( p_text )
+ {
+ text_style_t *p_style = text_style_New();
+ if ( p_style )
+ {
+ if ( p_text->i_font_size ) /* !WARN: % in absolute storage */
+ p_style->i_font_size = p_text->i_font_size;
+ if ( p_text->i_font_color )
+ {
+ p_style->i_font_color = p_text->i_font_color >> 8;
+ p_style->i_font_alpha = p_text->i_font_color & 0xFF;
+ }
+ if ( p_text->i_background_color )
+ {
+ p_style->i_background_color = p_text->i_background_color[0] >> 8;
+ p_style->i_background_color |= p_text->i_background_color[1] >> 8;
+ p_style->i_background_color |= p_text->i_background_color[2] >> 8;
+ p_style->i_background_alpha = p_text->i_background_color[3] >> 8;
+ }
+ }
+ p_track->fmt.subs.p_style = p_style;
+ }
/* FIXME: Not true, could be UTF-16 with a Byte Order Mark (0xfeff) */
/* FIXME UTF-8 doesn't work here ? */
if( p_track->b_mac_encoding )
@@ -1939,7 +1939,7 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
else
p_track->fmt.subs.psz_encoding = strdup( "UTF-8" );
break;
-
+ }
case VLC_FOURCC('y','v','1','2'):
p_track->fmt.i_codec = VLC_CODEC_YV12;
break;
@@ -2592,10 +2592,11 @@ static void MP4_TrackCreate( demux_t *p_demux, mp4_track_t *p_track,
p_track->fmt.i_cat = VIDEO_ES;
break;
+ case( ATOM_tx3g ):
case( ATOM_text ):
case( ATOM_subp ):
- case( ATOM_tx3g ):
case( ATOM_sbtl ):
+ p_track->fmt.i_codec = VLC_CODEC_TX3G;
p_track->fmt.i_cat = SPU_ES;
break;
More information about the vlc-commits
mailing list