]> git.sesse.net Git - vlc/blobdiff - modules/demux/mp4/mp4.c
* modules/demux/wav.c: misc improvements.
[vlc] / modules / demux / mp4 / mp4.c
index cb2955cbaafc2f3b2b97476455887db46a2df874..6a1b21fa1b4063f0bf7da2e250515fd3578e7eb1 100644 (file)
@@ -366,15 +366,16 @@ static int Open( vlc_object_t * p_this )
                     else
                     {
                         /* msg dbg relative ? */
-                        char *psz_absolute = alloca( strlen( p_demux->psz_path ) + strlen( psz_ref ) + 1);
+                        char *psz_absolute = alloca( strlen( p_demux->psz_access ) + 3 + strlen( p_demux->psz_path ) + strlen( psz_ref ) + 1);
                         char *end = strrchr( p_demux->psz_path, '/' );
 
                         if( end )
                         {
                             int i_len = end + 1 - p_demux->psz_path;
 
-                            strncpy( psz_absolute, p_demux->psz_path, i_len);
-                            psz_absolute[i_len] = '\0';
+                            strcpy( psz_absolute, p_demux->psz_access );
+                            strcat( psz_absolute, "://" );
+                            strncat( psz_absolute, p_demux->psz_path, i_len);
                         }
                         else
                         {
@@ -596,28 +597,31 @@ static int Demux( demux_t *p_demux )
                                   (uint32_t*)p_block->p_buffer,
                                   p_block->i_buffer );
                 }
-                else if( tk->fmt.i_cat == SPU_ES && p_block->i_buffer >= 2 )
+                else if( tk->fmt.i_cat == SPU_ES )
                 {
-                    uint16_t i_size = GetWBE( p_block->p_buffer );
-
-                    if( i_size + 2 <= p_block->i_buffer )
+                    if( tk->fmt.i_codec == VLC_FOURCC( 's', 'u', 'b', 't' ) && p_block->i_buffer >= 2 )
                     {
-                        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( p_block->p_buffer, '\r' ) ) )
+                        uint16_t i_size = GetWBE( p_block->p_buffer );
+
+                        if( i_size + 2 <= p_block->i_buffer )
                         {
-                            *p = '\n';
+                            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( p_block->p_buffer, '\r' ) ) )
+                            {
+                                *p = '\n';
+                            }
+                        }
+                        else
+                        {
+                            /* Invalid */
+                            p_block->i_buffer = 0;
                         }
-                    }
-                    else
-                    {
-                        /* Invalid */
-                        p_block->i_buffer = 0;
                     }
                 }
                 p_block->i_dts = MP4_TrackGetPTS( p_demux, tk ) + 1;
@@ -786,8 +790,13 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             return VLC_SUCCESS;
         }
 
+        case DEMUX_GET_TITLE_INFO:
+        case DEMUX_SET_NEXT_DEMUX_TIME:
+        case DEMUX_SET_GROUP:
+            return VLC_EGENERIC;
+
         default:
-            msg_Err( p_demux, "control query unimplemented !!!" );
+            msg_Warn( p_demux, "control query unimplemented !!!" );
             return VLC_EGENERIC;
     }
 }
@@ -1047,7 +1056,7 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
     p_sample = MP4_BoxGet(  p_track->p_stsd, "[%d]",
                 p_track->chunk[i_chunk].i_sample_description_index - 1 );
 
-    if( !p_sample || !p_sample->data.p_data )
+    if( !p_sample || ( !p_sample->data.p_data && p_track->fmt.i_cat != SPU_ES ) )
     {
         msg_Warn( p_demux,
                   "cannot find SampleEntry (track[Id 0x%x])",
@@ -1057,7 +1066,7 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
 
     p_track->p_sample = p_sample;
 
-    if( p_track->i_sample_size == 1 )
+    if( p_track->fmt.i_cat == AUDIO_ES && p_track->i_sample_size == 1 )
     {
         MP4_Box_data_sample_soun_t *p_soun;
 
@@ -1174,6 +1183,15 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
             case( 0x6c ): /* jpeg */
                 p_track->fmt.i_codec = VLC_FOURCC( 'j','p','e','g' );
                 break;
+
+            /* Private ID */
+            case( 0xe0 ): /* NeroDigital: dvd subs */
+                if( p_track->fmt.i_cat == SPU_ES )
+                {
+                    p_track->fmt.i_codec = VLC_FOURCC( 's','p','u',' ' );
+                    break;
+                }
+            /* Fallback */
             default:
                 /* Unknown entry, but don't touch i_fourcc */
                 msg_Warn( p_demux,
@@ -1596,6 +1614,7 @@ static void MP4_TrackCreate( demux_t *p_demux, mp4_track_t *p_track,
             break;
 
         case( FOURCC_text ):
+        case( FOURCC_subp ):
             p_track->fmt.i_cat = SPU_ES;
             break;