* mp4: support for tx3g subtitle (close #332)
authorLaurent Aimar <fenrir@videolan.org>
Thu, 6 Oct 2005 19:12:22 +0000 (19:12 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Thu, 6 Oct 2005 19:12:22 +0000 (19:12 +0000)
modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.h
modules/demux/mp4/mp4.c

index 7c9f6a3..025c226 100644 (file)
@@ -1280,46 +1280,90 @@ static int MP4_ReadBox_sample_mp4s( stream_t *p_stream, MP4_Box_t *p_box )
 static int MP4_ReadBox_sample_text( stream_t *p_stream, MP4_Box_t *p_box )
 {
     unsigned int i;
+    int32_t t;
 
     MP4_READBOX_ENTER( MP4_Box_data_sample_text_t );
 
-    for( i = 0; i < 6 ; i++ )
-    {
-        MP4_GET1BYTE( p_box->data.p_sample_text->i_reserved1[i] );
-    }
+    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( p_box->data.p_sample_text->i_justification );
+
+    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;
+    }
 
     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;
+
+    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 );
+
+#ifdef MP4_VERBOSE
+    msg_Dbg( p_stream, "read box: \"text\" in stsd text" );
+#endif
+    MP4_READBOX_EXIT( 1 );
+}
 
-    MP4_GET8BYTES( p_box->data.p_sample_text->i_text_box );
-    MP4_GET8BYTES( p_box->data.p_sample_text->i_reserved2 );
+static int MP4_ReadBox_sample_tx3g( stream_t *p_stream, MP4_Box_t *p_box )
+{
+    unsigned int i;
+    int32_t t;
 
-    MP4_GET2BYTES( p_box->data.p_sample_text->i_font_number );
-    MP4_GET2BYTES( p_box->data.p_sample_text->i_font_face );
+    MP4_READBOX_ENTER( MP4_Box_data_sample_text_t );
 
-    MP4_GET2BYTES( p_box->data.p_sample_text->i_reserved3 );
+    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_foreground_color[0] );
-    MP4_GET2BYTES( p_box->data.p_sample_text->i_foreground_color[1] );
-    MP4_GET2BYTES( p_box->data.p_sample_text->i_foreground_color[2] );
+    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( i );
-    p_box->data.p_sample_text->psz_text_name = malloc( i + 1 );
-    memcpy( p_box->data.p_sample_text->psz_text_name, p_peek, i );
-    p_box->data.p_sample_text->psz_text_name[i] = '\0';
+    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 );
 
 #ifdef MP4_VERBOSE
-    msg_Dbg( p_stream, "read box: \"text\" in stsd text name=%s",
-             p_box->data.p_sample_text->psz_text_name );
+    msg_Dbg( p_stream, "read box: \"text\" 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 )
@@ -2066,6 +2110,8 @@ static int MP4_ReadBox_default( stream_t *p_stream, MP4_Box_t *p_box )
                 return MP4_ReadBox_sample_vide( p_stream, p_box );
             case FOURCC_text:
                 return MP4_ReadBox_sample_text( p_stream, p_box );
+            case FOURCC_tx3g:
+                return MP4_ReadBox_sample_tx3g( p_stream, p_box );
             default:
                 msg_Warn( p_stream,
                           "unknown handler type in stsd (uncompletetly loaded)" );
index d08a8ef..c42b760 100644 (file)
 #define FOURCC_priv VLC_FOURCC( 'p', 'r', 'i', 'v' )
 
 #define FOURCC_text VLC_FOURCC( 't', 'e', 'x', 't' )
+#define FOURCC_tx3g VLC_FOURCC( 't', 'x', '3', 'g' )
 #define FOURCC_subp VLC_FOURCC( 's', 'u', 'b', 'p' )
 
 #define FOURCC_0xa9nam VLC_FOURCC( 0xa9, 'n', 'a', 'm' )
@@ -458,23 +459,45 @@ typedef struct MP4_Box_data_sample_vide_s
 
 } MP4_Box_data_sample_vide_t;
 
+#define MP4_TEXT_DISPLAY_FLAG_DONT_DISPLAY       (1<<0)
+#define MP4_TEXT_DISPLAY_FLAG_AUTO_SCALE         (1<<1)
+#define MP4_TEXT_DISPLAY_FLAG_CLIP_TO_TEXT_BOX   (1<<2)
+#define MP4_TEXT_DISPLAY_FLAG_USE_MOVIE_BG_COLOR (1<<3)
+#define MP4_TEXT_DISPLAY_FLAG_SHRINK_TEXT_BOX_TO_FIT (1<<4)
+#define MP4_TEXT_DISPLAY_FLAG_SCROLL_IN          (1<<5)
+#define MP4_TEXT_DISPLAY_FLAG_SCROLL_OUT         (1<<6)
+#define MP4_TEXT_DISPLAY_FLAG_HORIZONTAL_SCROLL  (1<<7)
+#define MP4_TEXT_DISPLAY_FLAG_REVERSE_SCROLL     (1<<8)
+#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_SCROLL  (1<<9)
+#define MP4_TEXT_DISPLAY_FLAG_FLOW_HORIZONTAL    (1<<10)
+#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_KARAOKE (1<<11)
+#define MP4_TEXT_DISPLAY_FLAG_DROP_SHADOW        (1<<12)
+#define MP4_TEXT_DISPLAY_FLAG_ANTI_ALIAS         (1<<13)
+#define MP4_TEXT_DISPLAY_FLAG_KEYED_TEXT         (1<<14)
+#define MP4_TEXT_DISPLAY_FLAG_INVERSE_HILITE     (1<<15)
+#define MP4_TEXT_DISPLAY_FLAG_COLOR_HILITE       (1<<16)
+#define MP4_TEXT_DISPLAY_FLAG_WRITE_VERTICALLY   (1<<17)
+
 typedef struct
 {
-    uint8_t  i_reserved1[6];
+    uint32_t i_reserved1;
+    uint16_t i_reserved2;
+
     uint16_t i_data_reference_index;
 
-    uint32_t i_display_flags;
-    uint32_t i_justification;
-    uint16_t i_background_color[3];
-    uint64_t i_text_box;
-    uint64_t i_reserved2;
-    uint16_t i_font_number;
-    uint16_t i_font_face;
-    uint16_t i_reserved3;
+    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_foreground_color[3];
+    uint16_t i_text_box_top;
+    uint16_t i_text_box_left;
+    uint16_t i_text_box_bottom;
+    uint16_t i_text_box_right;
 
-    char    *psz_text_name;
+    // TODO to complete
 } MP4_Box_data_sample_text_t;
 
 typedef struct MP4_Box_data_sample_hint_s
index edc122b..71190e2 100644 (file)
@@ -1278,6 +1278,7 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
             break;
 
         case( VLC_FOURCC( 't', 'e', 'x', 't' ) ):
+        case( VLC_FOURCC( 't', 'x', '3', 'g' ) ):
             p_track->fmt.i_codec = VLC_FOURCC( 's', 'u', 'b', 't' );
             /* FIXME: Not true, could be UTF-16 with a Byte Order Mark (0xfeff) */
             /* FIXME UTF-8 doesn't work here ? */
@@ -1777,6 +1778,7 @@ static void MP4_TrackCreate( demux_t *p_demux, mp4_track_t *p_track,
 
         case( FOURCC_text ):
         case( FOURCC_subp ):
+        case( FOURCC_tx3g ):
             p_track->fmt.i_cat = SPU_ES;
             break;