Commit 7bde66d8 authored by François Cartegnie's avatar François Cartegnie 🤞

demux: mp4: merge text samples and pass to extradata

parent 0953abb4
......@@ -1274,36 +1274,18 @@ int SetupSpuES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample )
p_track->fmt.i_codec = VLC_CODEC_TX3G;
if( p_text->i_display_flags & 0xC0000000 )
if( GetDWBE(p_text->p_data) & 0xC0000000 )
{
p_track->fmt.i_priority = ES_PRIORITY_SELECTABLE_MIN + 1;
p_track->b_forced_spu = true;
}
text_style_t *p_style = text_style_Create( STYLE_NO_DEFAULTS );
if ( p_style )
p_track->fmt.p_extra = malloc( p_text->i_data );
if( p_track->fmt.p_extra )
{
if ( p_text->i_font_size ) /* !WARN: in % of 5% height */
{
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;
p_style->i_features |= (STYLE_HAS_FONT_ALPHA | STYLE_HAS_FONT_COLOR);
}
if ( p_text->i_background_color[3] >> 8 )
{
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_style->i_features |= (STYLE_HAS_BACKGROUND_ALPHA | STYLE_HAS_BACKGROUND_COLOR);
}
memcpy( p_track->fmt.p_extra, p_text->p_data, p_text->i_data );
p_track->fmt.i_extra = p_text->i_data;
}
assert(p_track->fmt.i_cat == SPU_ES);
p_track->fmt.subs.p_style = p_style;
/* FIXME UTF-8 doesn't work here ? */
if( p_track->b_mac_encoding )
......
......@@ -2770,52 +2770,30 @@ static int MP4_ReadBox_sample_hint8( stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT( 1 );
}
static int MP4_ReadBox_sample_text( stream_t *p_stream, MP4_Box_t *p_box )
static int MP4_FreeBox_sample_text( MP4_Box_t *p_box )
{
int32_t t;
free( p_box->data.p_sample_text->p_data );
}
static int MP4_ReadBox_sample_text( stream_t *p_stream, MP4_Box_t *p_box )
{
p_box->i_handler = ATOM_text;
MP4_READBOX_ENTER( MP4_Box_data_sample_text_t, NULL );
MP4_READBOX_ENTER( MP4_Box_data_sample_text_t, MP4_FreeBox_sample_text );
MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved1 );
MP4_GET2BYTES( p_box->data.p_sample_text->i_reserved2 );
MP4_GET2BYTES( p_box->data.p_sample_text->i_data_reference_index );
MP4_GET4BYTES( p_box->data.p_sample_text->i_display_flags );
MP4_GET4BYTES( t );
switch( t )
{
/* FIXME search right signification */
case 1: // Center
p_box->data.p_sample_text->i_justification_horizontal = 1;
p_box->data.p_sample_text->i_justification_vertical = 1;
break;
case -1: // Flush Right
p_box->data.p_sample_text->i_justification_horizontal = -1;
p_box->data.p_sample_text->i_justification_vertical = -1;
break;
case -2: // Flush Left
p_box->data.p_sample_text->i_justification_horizontal = 0;
p_box->data.p_sample_text->i_justification_vertical = 0;
break;
case 0: // Flush Default
default:
p_box->data.p_sample_text->i_justification_horizontal = 1;
p_box->data.p_sample_text->i_justification_vertical = -1;
break;
}
if( i_read < 32 )
MP4_READBOX_EXIT( 0 );
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] = 0xFF;
p_box->data.p_sample_text->p_data = malloc( i_read );
if( !p_box->data.p_sample_text->p_data )
MP4_READBOX_EXIT( 0 );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_top );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_left );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_bottom );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_right );
p_box->data.p_sample_text->i_data = i_read;
memcpy( p_box->data.p_sample_text->p_data, p_peek, i_read );
#ifdef MP4_VERBOSE
msg_Dbg( p_stream, "read box: \"text\" in stsd text" );
......@@ -2841,53 +2819,6 @@ static int MP4_ReadBox_sample_clcp( stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT( 1 );
}
static int MP4_ReadBox_sample_tx3g( stream_t *p_stream, MP4_Box_t *p_box )
{
p_box->i_handler = ATOM_text;
MP4_READBOX_ENTER( MP4_Box_data_sample_text_t, NULL );
MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved1 );
MP4_GET2BYTES( p_box->data.p_sample_text->i_reserved2 );
MP4_GET2BYTES( p_box->data.p_sample_text->i_data_reference_index );
MP4_GET4BYTES( p_box->data.p_sample_text->i_display_flags );
MP4_GET1BYTE ( p_box->data.p_sample_text->i_justification_horizontal );
MP4_GET1BYTE ( p_box->data.p_sample_text->i_justification_vertical );
MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[0] );
MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[1] );
MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[2] );
MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[3] );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_top );
MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_left );
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
MP4_READBOX_EXIT( 1 );
}
#if 0
/* We can't easily call it, and anyway ~ 20 bytes lost isn't a real problem */
static void MP4_FreeBox_sample_text( MP4_Box_t *p_box )
{
free( p_box->data.p_sample_text->psz_text_name );
}
#endif
static void MP4_FreeBox_stsz( MP4_Box_t *p_box )
{
free( p_box->data.p_stsz->i_entry_size );
......@@ -4299,10 +4230,9 @@ static int MP4_ReadBox_default( stream_t *p_stream, MP4_Box_t *p_box )
case ATOM_hint:
return MP4_ReadBox_sample_hint8( p_stream, p_box );
case ATOM_text:
return MP4_ReadBox_sample_text( p_stream, p_box );
case ATOM_tx3g:
case ATOM_sbtl:
return MP4_ReadBox_sample_tx3g( p_stream, p_box );
return MP4_ReadBox_sample_text( p_stream, p_box );
default:
msg_Warn( p_stream,
"unknown handler type in stsd (incompletely loaded)" );
......@@ -4478,7 +4408,8 @@ static const struct
{ ATOM_binm, MP4_ReadBoxSkip, 0 },
/* Subtitles */
{ ATOM_tx3g, MP4_ReadBox_sample_tx3g, 0 },
{ ATOM_tx3g, MP4_ReadBox_sample_text, ATOM_sbtl },
{ ATOM_tx3g, MP4_ReadBox_sample_text, ATOM_text },
{ ATOM_c608, MP4_ReadBox_sample_clcp, ATOM_stsd },
//{ ATOM_text, MP4_ReadBox_sample_text, 0 },
/* In sample WebVTT subtitle atoms. No ATOM_wvtt in normal parsing */
......
......@@ -742,26 +742,9 @@ typedef struct
uint16_t i_data_reference_index;
uint32_t i_display_flags; // TextDescription and Tx3gDescription
int8_t i_justification_horizontal; // left(0), centered(1), right(-1)
int8_t i_justification_vertical; // top(0), centered(1), bottom(-1)
uint16_t i_background_color[4];
uint16_t i_text_box_top;
uint16_t i_text_box_left;
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
uint8_t *p_data;
size_t i_data;
// TODO to complete
} MP4_Box_data_sample_text_t;
typedef struct
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment